グローバルフックをかける

うーん。昨日のは会社で使ってみたんだけど、なんか、Excelで使ってみると使いものにならないよ…しかし、家にはExcelが無いので確認できない。


まあいいか。Windowsでグローバルフックをかけるときに必要になる周辺知識について書いとこう。グローバルフックは、他のウィンドウのイベントを奪ったり変更したりできるというもの。色々妄想をたくましくできると思う。


まず、フックをかけるのは、SetWindowsHookExこれ。


ただ、グローバルフックは面倒な問題がある。フックプロシージャは各スレッドのメモリ空間で動くのだ。
Excelのイベントを奪うときに呼び出された場合と、メモ帳のイベントを奪うときに呼び出された場合では、別のプロセスで動いてることになる。ので、グローバル変数が使えない。


解決方法は色々あると思うけど、昨日のは以下のようにしてた。
まず、共有メモリを作る。CreateFileMappingと、MapViewOfFileでできる。んで、そこに、フック用DLLを起動したアプリのウィンドウハンドルを入れとく。
んで、保存しないといけないデータが出てきたら、WM_COPYDATAメッセージを使って、アプリにデータを渡す。
あとは届いたWM_COPYDATAを適度に処理。


これで、全てのフックからのデータをアプリに集めることができる。
あとは適当に。