Обнаружение присутствия пользователя
Я хотел бы определить, активно ли пользователь использует компьютер под управлением Windows (2000 или более поздняя версия). Желательно, чтобы я делал это, не прибегая к использованию заставок.
Фон: у нас есть отдел обслуживания клиентов, который находится в группе поиска и может быть "Доступен" или нет. Если они "доступны", звонки будут направляться на их телефон, а не сидеть в очереди. Пока телефон звонит по добавочному номеру, входящий абонент слышит "звонящий" звук, а не удерживает музыку. К сожалению, у нас также есть представители, которые забывают взять себя из "Доступного", когда они идут на обед или уходят на целый день.
Конечный результат, скорее всего, будет написан с использованием.NET
Какие-нибудь мысли?
4 ответа
Если пользователи блокируют свои рабочие станции или если групповая политика вызвала блокировку экрана после некоторого количества бездействующих минут, вы можете использовать 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);
}
Вы можете использовать Windows API, чтобы добавить низкоуровневый хук клавиатуры / мыши, затем пометить как удаленный, если какое-то время не было никаких действий, и пометить как доступный, когда действие начнется снова.
http://www.codeproject.com/KB/cs/globalhook.aspx имеет кое-что об этом, но это на C#.