2009-06-18 5 views
3

Ich möchte feststellen, ob ein Benutzer einen Computer mit Windows (2000 oder höher) aktiv verwendet. Am liebsten würde ich dies tun, ohne Bildschirmschoner zu verwenden.Erkennen der Benutzerpräsenz

Hintergrund: Wir haben eine Kundendienstabteilung, die in einem Sammelanschluss sitzt und "verfügbar" sein kann oder nicht. Wenn sie "Verfügbar" sind, werden Anrufe an ihr Telefon weitergeleitet, anstatt in der Warteschlange zu sitzen. Während das Telefon an einer Nebenstelle klingelt, hört der ankommende Anrufer den "klingelnden" Ton und nicht die Musik. Leider haben wir auch Wiederholungen, die vergessen, sich aus "Verfügbar" zu machen, wenn sie zum Mittagessen gehen oder für den Tag gehen.

Das Endergebnis wahrscheinlich geschrieben .NET würde

Irgendwelche Gedanken?

+0

Wenn Menschen ihre Computer verlassen, sperren sie ihre Computer? – Yoopergeek

Antwort

0

Sie können die Windows-API verwenden, um einen Low-Level-Tastatur-/Maus-Hook hinzuzufügen, dann als Abwesenheit markieren, wenn längere Zeit keine Aktivität vorhanden war, und als verfügbar markieren, wenn die Aktivität von neuem beginnt.

http://www.codeproject.com/KB/cs/globalhook.aspx hat etwas dabei, aber es ist in C#.

+0

Genau das hat meine Google-Suche nicht gefunden. Danke für die schnelle Antwort! – smbarbour

+0

Warum haken, wenn Sie einfach die letzte Benutzeraktivitätszeit mit GetLastInputInfo() anfordern können? – macbirdie

+0

@macbirdie Weil ich keinerlei Erfahrung mit der Windows API habe. – MiffTheFox

2

Wenn Benutzer ihre Arbeitsstationen sperren oder wenn Gruppenrichtlinien eine Bildschirmsperre nach einigen Minuten Leerlauf erzwingen, können Sie mithilfe der Windows-API das Ereignis "Sitzungsbenachrichtigung" unter Verwendung von WTSRegisterSessionNotification und WTSUnRegisterSessionNotification abonnieren. Sobald Sie Windows aufgefordert haben, Ihre Anwendung darüber zu informieren, dass die Sitzung gesperrt wurde, können Sie dies als Hinweis darauf verwenden, dass der Benutzer nicht anwesend ist.

Gute Lesung: http://support.microsoft.com/kb/310153

Beispiel:

private const int NOTIFY_FOR_THIS_SESSION = 0x0; 
private const int WM_WTSSESSION_CHANGE = 0x2B1; 
private const int WTS_CONSOLE_CONNECT = 0x1; 
private const int WTS_CONSOLE_DISCONNECT = 0x2; 
private const int WTS_SESSION_LOCK = 0x7; 
private const int WTS_SESSION_UNLOCK = 0x8; 
private const int WM_DESTROY = 0x2; 
private const int WM_ACTIVATEAPP = 0x1C; 

// The WTSUnRegisterSessionNotification function unregisters the specified 
// window so that the specified window receives no more session-change notifications. 
[DllImport("Wtsapi32.dll")] 
private static extern bool WTSUnRegisterSessionNotification(IntPtr hWnd); 

// The WTSRegisterSessionNotification function registers the specified 
// window to receive session-change notifications. 
[DllImport("Wtsapi32.dll")] 
private static extern bool WTSRegisterSessionNotification(IntPtr hWnd, Int32 dwFlags); 

// The PostQuitMessage function indicates to the system that a thread 
// has made a request to quit. The PostQuitMessage function is typically used in 
// response to a WM_DESTROY message. 
[DllImport("user32.dll")] 
private static extern void PostQuitMessage(Int32 nExitCode); 

[DllImport("user32.dll", CharSet = CharSet.Auto)] 
public static extern IntPtr PostMessage(HandleRef hwnd, int msg, int wparam, int lparam); 

private void Unsubscribe() { 
    if (this.Handle != IntPtr.Zero) { 
     WTSUnRegisterSessionNotification(this.Handle); 
    } 
} 

private void Subscribe() { 
    if (this.Handle != IntPtr.Zero) { 
     WTSRegisterSessionNotification(this.Handle, NOTIFY_FOR_THIS_SESSION); 
    } 
} 

// override WndProc in order to catch process the Session-Notification events: 
protected override void WndProc(ref Message m) { 
    switch (m.Msg) { 
     case WM_WTSSESSION_CHANGE: 
     switch (m.WParam.ToInt32()) { 
      case WTS_CONSOLE_CONNECT: 
       // User-switch : Sign-on 
       break; 
      case WTS_CONSOLE_DISCONNECT: 
       // User-switch : Sign-off 
       break; 
      case WTS_SESSION_LOCK: 
       // Screen Lock 
       break; 
      case WTS_SESSION_UNLOCK: 
       // Screen Unlock 
       break; 
      default: 
       break; 
     } 
     break; 
     default: 
     break; 
    } 

    base.WndProc(ref m); 
} 
+0

Sorry, das ist C# -Code, wenn die Frage markiert ist VB.NET ... – Yoopergeek

+0

Es ist einfach genug, hier (http://www.developerfusion.com/tools/convert/csharp-to-vb/) und zu konvertieren VB.NET. Menschen sollten keine Angst haben, von einer Sprache in eine andere zu konvertieren. (Angenommen, die Funktionalität wird in der anderen Sprache unterstützt.) – beach

+0

BTW, das ist eine gute Antwort. – beach

Verwandte Themen