• ベストアンサー
※ ChatGPTを利用し、要約された質問です(原文:マウスホイールをフックしたい)

マウスホイールをフックする方法

このQ&Aのポイント
  • Win32APIを使用してマウスホイールをフックする方法を教えてください。
  • 具体的には、SetWindowsHookEx APIを使用してWH_MOUSEタイプをフックし、MouseProcフックプロシジャーでWM_MOUSEWHELLメッセージをフックします。
  • しかし、ホイールの回転方向がわからず、行き詰まっています。スレッドローカルなフックで解決する方法はありますか?

質問者が選んだベストアンサー

  • ベストアンサー
  • anmochi
  • ベストアンサー率65% (1332/2045)
回答No.1

 WM_MOUSEWHELLでwParamには何が入ってきてます?  記憶を頼りに書いてますが下位ワードに押されているマウスボタン、上位ワードにホイールスクロール量が入ってたと思います。  HIWORD(wParam)を調べて、+だったら上、-だったら下、あるいは逆(どっちか忘れました)。

taranrappu
質問者

お礼

http://msdn.microsoft.com/library/default.asp?url=/library/en-us/winui/winui/windowsuserinterface/windowing/hooks/hookreference/hookstructures/mousehookstructex.asp この構造体に欲しい情報が入ってくるようです。 ただ、WH_MOUSEタイプのフックをするだけでは ダメかもしれません。 もう少し調べてみます。 ありがとうございました。

taranrappu
質問者

補足

コメントありがとうございます。 WM_MOUSEWHELLメッセージの WPARAM、LPARAMを参照することで スクロール量(方向も含めて) が取得できることは理解しているのですが SetWindowsHookEx APIで WH_MOUSEをフックした時に WM_MOUSEWHELLメッセージを捕捉した場合は フックプロシジャーのMouseProcの WPARAMはメッセージIDです(この場合WM_MOUSEWHELL) LPARAMはMOUSEHOOKSTRUCT構造体を指すポインタです。 ホイールしたことはこれでまず判断できますが その後、ホイール量やその方向を知ることができません。 MOUSEHOOKSTRUCT構造体の詳細は下記の通りです。 typedef struct tagMOUSEHOOKSTRUCT { /* ms */ POINT pt; HWND hwnd; UINT wHitTestCode; DWORD dwExtraInfo; } MOUSEHOOKSTRUCT; MOUSEHOOKSTRUCT構造体は、 マウス イベントに関する情報を格納します。 メンバ 説明 pt マウス カーソルのx座標とy座標をスクリーン座標で格納する、 POINT構造体を指定します。 hwnd マウス イベントに対応するマウス メッセージを受け取るウィンドウを識別します。 wHitTestCode ヒット テスト コードを指定します。ヒット テスト コードの一覧については、 WM_NCHITTESTメッセージの説明を参照してください。 dwExtraInfo マウス イベントに関連付けられる追加情報を指定します。 ここで唯一、dwExtraInfoメンバに メッセージに付随する何らかの拡張情報が入っていることを期待したのですが オールゼロでした。 ならばと、PeekMessageでWM_MOUSEWHELLそのものを取り出そうとしましたが メッセージキューにはありません。 なお、最初の質問で説明が漏れておりましたが WH_MOUSE タイプ以外の種類のフックで 同メッセージを捕捉しようとしたのですが フォーム上にComboBoxコントロールが存在する場合は そちら側へWM_MOUSEWHELLメッセージが飛んでしまって 捕捉できませんでした。 ComboBoxをサブクラス化するなどすることで 対応は可能なのですが 何分、数が多く、しかもそれが可変でして かなり地道な作業になりそうです。

関連するQ&A