2009-03-02 10 views
7

DUPLICATE:Windowsユーザーが自分の画面(Windowsの+のL)をロックして、もう一度それをアンロックしてい私は(実行時に)検出することができますどのようにHow can I programmatically determine if my workstation is locked?のC#とワークステーションのロック/アンロックの変更の確認

。私はキーボード入力をグローバルに追跡できることは知っていますが、そのようなことを環境変数で確認することは可能ですか?

+0

この質問に対する回答があなたの出発点となるかもしれません。みんなに感謝します。 http://stackoverflow.com/questions/44980 –

+0

あなたはいつものようにとても役に立ちました:) –

答えて

3

この通知は、WM_WTSSESSION_CHANGEメッセージで取得できます。 WTSRegisterSessionNotificationを介してこれらのメッセージを受信し、WTSUnRegisterSessionNotificationを使用して登録を解除することをWindowsに通知する必要があります。

これらの投稿は、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

+0

数秒で私を叩きました:) – shahkalpesh

+0

-1:このマネージコード版は、Win32版が登場する前に投稿されました...なぜこれも正解とマークされていますか? – Powerlord

+0

ほとんどダウンボートの理由はありませんか? –

-2

あなたは絶対にだけ内部WTTS APIを使用WM_WTSSESSION_CHANGE 必要はありません。

2

これらのイベントを取得する別の方法として、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); 
     } 
    } 
} 
関連する問題