Обнаружение присутствия пользователя

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

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

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

Какие-нибудь мысли?

4 ответа

Решение

Для этого следует использовать API GetLastInputInfo ().

Если пользователи блокируют свои рабочие станции или если групповая политика вызвала блокировку экрана после некоторого количества бездействующих минут, вы можете использовать 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);
}

Посмотрите на SetWindowsHookEx и класс WH_FOREGROUNDIDLE.

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

http://www.codeproject.com/KB/cs/globalhook.aspx имеет кое-что об этом, но это на C#.

Другие вопросы по тегам