ユーザーがワークステーションをロックしている場合、または何分のアイドル時間が経過してもグループポリシーが画面ロックを強制した場合、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);
}
人がコンピュータから離れると、コンピュータをロックしますか? – Yoopergeek