SetWindowsHookEx
関数でマウスをフックし、マウスポインタが指すウィンドウのハンドルを取得するプログラムを書いた際に気がついた事のメモ。
まずWH_MOUSE
ではフックを開始したスレッドのウィンドウしかフックできない模様。
WH_KEYBOARD
も試してはいないが同じ結果になると思う。
少なくともこれだけではポインタが指すウィンドウのハンドルは取得できない。
次にWH_MOUSE_LL
を使う方法を試す。
LLはLowLevelの略であり、マウスの動きをウィンドウ単位ではなく画面単位で監視する。
しかし今度は低レベルすぎて、ウィンドウハンドルがコールバック関数のパラメータに含まれない。
これではポインタの指し示すウィンドウのハンドルがわからない。
しかし一方で新たな収穫があった。
この低レベルフックは別にDLLを作らなくても使えるというのがわかった。
Windows2000以降にしか対応していないとのことだが、どうせ世間にはXPとVistaばっかり出回っているので問題ない。
今回のプログラムはVistaで実行したため、Vistaの権限の制限が悪さをした可能性も考え、
ChangeWindowMessageFilter
でフィルタを解除する事も試してみたものの、
関係ない事が判明した。
今構想中のプログラムで必要になるかもしれないので、これはこれで記憶の隅にとどめておく事にする。
最終的には、スクリーン座標からウィンドウハンドルが得られる方法を探す事にした。
ClientToScreen
やScreenToClient
はまったく役に立たず、
EnumWindows
はさすがに手間がかかりすぎる。
紆余曲折を経て、WindowFromPosision
というあまりにもそのまますぎる関数を発見した。
この関数と低レベルフックを組み合わせ、マウスポインタの指すウィンドウのハンドルを取得する事に成功した。
以上本日のメモ終わり
参考URL抜粋
- グローバルフックを使う - 窓プログラミング
- SetWindowsHookEx 関数 - MSDN Library
- Vistaでフックを使うときは注意が必要 - tomoemonの日記
- ウインドウスタイルをいじってみる - Shuhitu the text editor
- WindowFromPoint関数 - MSDN Library
上記内容とは別に見つけた面白そうなページ
コメントする