2009-06-18 3 views
3

Что я хотел бы сделать, это определить, активно ли пользователь использует компьютер под управлением Windows (2000 или новее). Предпочтительно, я хотел бы сделать это, не прибегая к использованию скринсейверов.Обнаружение присутствия пользователя

Общие сведения: У нас есть отдел обслуживания клиентов, который находится в группе поиска и может быть «Доступен» или нет. Если они «Доступны», вызовы будут перенаправляться на их телефон, а не сидеть в очереди. Когда телефон звонит на добавочный номер, входящий абонент слышит звук «звонка», а не удерживает музыку. К сожалению, у нас также есть представители, которые забывают вырваться из «Доступного», когда отправляются на обед или уезжают на день.

Конечный результат, скорее всего, будет написана с использованием .NET

Любые мысли?

+0

Когда люди покидают свои компьютеры, они блокируют свои компьютеры? – Yoopergeek

ответ

0

Вы можете использовать Windows API, чтобы добавить низкоуровневый крючок для клавиатуры/мыши, а затем отметить как отсутствующий, если на какое-то время не было никакой активности, а затем пометить как доступную, когда действие начнется снова.

есть что-то на этом, но это на C#.

+0

Это именно то, чего не нашел мой поисковый запрос Google. Спасибо за быстрый ответ! – smbarbour

+0

Зачем перехватывать, когда вы можете просто запросить последнее время активности пользователя с помощью GetLastInputInfo()? – macbirdie

+0

@macbirdie Потому что у меня нет опыта работы с Windows API. – MiffTheFox

2

Если пользователи блокируют свои рабочие станции или если групповая политика принудительно блокирует блокировку после некоторого количества минут ожидания, вы можете использовать Windows API для подписки на событие «Уведомление о сеансе» с использованием WTSRegisterSessionNotification и WTSUnRegisterSessionNotification. После того, как вы попросите Windows сообщить своему приложению, что сеанс заблокирован, вы можете использовать это как указание на то, что пользователь отсутствует.

Хорошее чтение: http://support.microsoft.com/kb/310153

Пример:

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

К сожалению, это код C#, когда вопрос отмечен VB.NET ... – Yoopergeek

+0

Здесь достаточно просто (http://www.developerfusion.com/tools/convert/csharp-to-vb/) и конвертировать его в VB.NET. Люди не должны бояться переходить с одного языка на другой. (Предполагая, что функциональность поддерживается на другом языке.) – beach

+0

Кстати, это отличный ответ. – beach

Смежные вопросы