質問: こんにちは。 Windows10でC#/Form/WPFのアプリケーションを開発しています。 Visual Studio 2015 Communityを使っています。 ### 前提・実現したいこと エクスプローラを監視して、×ボタンを押したことを取得したいです。 そういうことって、可能ですか? どういう手順を経ればよいものでしょう? ### 補足情報(言語/FW/ツール等のバージョンなど) Microsoft Visual Studio Community 2015 Version 14.0.25424.00 Update 3 Microsoft .NET Framework Version 4.6.01038 インストールしているバージョン:Community Visual C# 2015 00322-20000-00000-AA575 Microsoft Visual C# 2015 です。 よろしくお願いします。
回答: 以下のような手順で可能だと思います。 CまたはC++でグローバルフック用のDLLを作成する SetWindowsHookExにWH_CALLWNDPROCまたはWH_CALLWNDPROCRETを指定してグローバルフックする。 対象プロセス内で読み込まれたDLL内でエクスプローラーかどうかをプロセス名などから判定する。 ルートのウィンドウハンドルを取得する(これは行わなくてもいいかもしれない) CallWndRetProc内でルートのウィンドウハンドルかチェックする(これも行わなくてもいいかもしれない) 送信されたWindowメッセージがWM_SYSCOMMANDでSC_CLOSEかどうかをチェックする グローバルフックの具体的なソースコードは以下が参考になります。 第163章 WH_CALLWNDPROCフック 注意点として、キーボードフックを使用するC#の例が見つかるかと思いますが、 WH_CALLWNDPROCを使用したい場合はC#では基本的に無理です。 追記 C#のみでなんとかしたい場合はUIAutomationで何とかなるかもしれません。 参考URL UIAutomattionでのイベントの補足の例 http://u338steven.hateblo.jp/entry/2016/08/23/120353 https://msdn.microsoft.com/ja-jp/library/ms752297(v=vs.110).aspx WindowCloseのイベントを取得する例 https://msdn.microsoft.com/ja-jp/library/system.windows.automation.windowpattern.windowclosedevent(v=vs.110).aspx