C#のWinFormsプロジェクトで、ユーザーがスクリーンロック操作やロックの解除をした際のイベントを取得する場合の方法について備忘録的に投稿します。
Ctrl+Alt+Deleteのキーイベントでは無理
例えば、WindowsHookを利用してキーイベントを検出して[Ctrl]と[Alt]と[Delete]が同時に押された時などを判定材料にすると、正しく取得できない場合があります。
原因は、Windowsでは[Ctrl+Alt+Delete]の組合せの操作は特殊な扱いになっていて、キーが操作された場合にOS側がキーのイベントを途中で横取りしてしまいます。
これは、ソフトが勝手にスクリーンロックやログオフをさせないために[Secure Attention Sequence]と呼ばれるセキュリティです。
グループポリシーエディターで無効化すれば取得も可能ですが、セキュリティを下げてしまうので、通常は無効になりません。
セッションの変更で取得
最も効果的なのは[SystemEvents]アセンブリ内の[SessionSwitch]イベントで、セッションが変更された理由で検出が可能です。
こんな感じで、イベントの取得が可能です。
SystemEvents.SessionSwitch += (s, e) =>
{
if (e.Reason == SessionSwitchReason.SessionLock)
{
//スクリーンロックされた
}
if (e.Reason == SessionSwitchReason.SessionUnlock)
{
//スクリーンロックが解除された
}
};
列挙型の[SessionSwitchReason]には、スクリーンロック以外にも、リモート接続やログオフなども用意されています。
詳しい内容は、公式ドキュメントの[SessionSwitchReason 列挙型]に記載があります。
まとめ
今回は短い記事ですが、WinFormsプロジェクトで、ユーザーがスクリーンロック操作やロックの解除をした際のイベントを取得する場合の方法について書きました。
Windowsでは、[Ctrl+Alt+Delete]は特殊で、この組み合わせでキーが操作された場合にOS側がキーのイベントを横取りしてしまいます。
そのため、スクリーンロックなどの操作を検出したい場合、[SystemEvents]アセンブリ内の[SessionSwitch]イベントで[SessionSwitchReason 列挙型]の種類で判定が可能です。
WinFormsプロジェクトでスクリーンロックやロックの解除をイベントとして取得したい人の参考になれば幸いです。
スポンサーリンク
最後までご覧いただき、ありがとうございます。

