C#を使用したワークステーションのロック/ロック解除の変更の確認
-
03-07-2019 - |
質問
重複: ワークステーションがロックされているかどうかをプログラムで判断するにはどうすればよいですか
Windowsユーザーが画面をロック(Windows + L)し、再びロックを解除したことを(実行中に)検出するにはどうすればよいですか。キーボード入力をグローバルに追跡できることは知っていますが、環境変数を使用してそのようなことを確認することは可能ですか?
解決
この通知は、WM_WTSSESSION_CHANGEメッセージを介して取得できます。 WTSRegisterSessionNotificationを介してこれらのメッセージを受信することをWindowsに通知し、WTSUnRegisterSessionNotificationから登録解除する必要があります。
これらの投稿は、C#の実装に役立つはずです。
http://pinvoke.net/default.aspx/wtsapi32.WTSRegisterSessionNotification
http://blogs.msdn.com/shawnfa /archive/2005/05/17/418891.aspx
http://bytes.com/groups/net -c / 276963-trapping-when-workstation-locked
他のヒント
SessionSwitch イベントが最善の策ですこのため。
これらのイベントを取得する別の方法として、 ComponentDispatcher
を使用できます。
これをラップするクラスの例を以下に示します。
public class Win32Session
{
private const int NOTIFY_FOR_THIS_SESSION = 0;
private const int WM_WTSSESSION_CHANGE = 0x2b1;
private const int WTS_SESSION_LOCK = 0x7;
private const int WTS_SESSION_UNLOCK = 0x8;
public event EventHandler MachineLocked;
public event EventHandler MachineUnlocked;
public Win32Session()
{
ComponentDispatcher.ThreadFilterMessage += ComponentDispatcher_ThreadFilterMessage;
}
void ComponentDispatcher_ThreadFilterMessage(ref MSG msg, ref bool handled)
{
if (msg.message == WM_WTSSESSION_CHANGE)
{
int value = msg.wParam.ToInt32();
if (value == WTS_SESSION_LOCK)
{
OnMachineLocked(EventArgs.Empty);
}
else if (value == WTS_SESSION_UNLOCK)
{
OnMachineUnlocked(EventArgs.Empty);
}
}
}
protected virtual void OnMachineLocked(EventArgs e)
{
EventHandler temp = MachineLocked;
if (temp != null)
{
temp(this, e);
}
}
protected virtual void OnMachineUnlocked(EventArgs e)
{
EventHandler temp = MachineUnlocked;
if (temp != null)
{
temp(this, e);
}
}
}
WM_WTSSESSION_CHANGEは絶対に必要ありません 内部WTTS APIを使用するだけです。