回答編集履歴

1 C#のみでなんとかしたい場合の追記

hmmm

hmmm score 798

2017/03/07 22:33  投稿

以下のような手順で可能だと思います。
CまたはC++でグローバルフック用のDLLを作成する
SetWindowsHookExにWH_CALLWNDPROCまたはWH_CALLWNDPROCRETを指定してグローバルフックする。
対象プロセス内で読み込まれたDLL内でエクスプローラーかどうかをプロセス名などから判定する。
ルートのウィンドウハンドルを取得する(これは行わなくてもいいかもしれない)
CallWndRetProc内でルートのウィンドウハンドルかチェックする(これも行わなくてもいいかもしれない)
送信されたWindowメッセージがWM_SYSCOMMANDでSC_CLOSEかどうかをチェックする
グローバルフックの具体的なソースコードは以下が参考になります。
[第163章 WH_CALLWNDPROCフック](http://www.kumei.ne.jp/c_lang/sdk2/sdk_163.htm)
注意点として、キーボードフックを使用するC#の例が見つかるかと思いますが、
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

思考するエンジニアのためのQ&Aサイト「teratail」について詳しく知る