質問

重複: ワークステーションがロックされているかどうかをプログラムで判断するにはどうすればよいですか

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 イベントが最善の策ですこのため。 SessionSwitchReason を確認します。 http://msdn.microsoft.com/en-us/library/microsoft.win32.sessionswitcheventargs.aspx "rel =" noreferrer "> SessionSwitchEventArgs を使用して、スイッチの種類を確認し、適切に対応します。

これらのイベントを取得する別の方法として、 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を使用するだけです。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top