プロが教える店舗&オフィスのセキュリティ対策術

かなり突っ込んだ質問かもしれませんが
Win32API系の質問です。

マウスホイールをフックするコードを書いています。
フックはDLLが必要なグローバルフックではなく
スレッドローカルなフックです。
具体的には

1.SetWindowsHookEx APIでWH_MOUSEタイプをフック

2.MouseProcフックプロシジャーでWM_MOUSEWHELLメッセージはフックできている。

ここまでは良いのですが
ホイールの回転方向がわかりません。

MouseProcフックプロシジャーのlParamを
MOUSEHOOKSTRUCT構造体へキャストしても
dwExtraInfo追加情報には何も入っておらず
(オールゼロでした。)
行き詰っています。

試しにフック後に
PeekMessageも試みましたがダメでした。

諸事情でグローバルフックは使いたくなくて
スレッドローカルなフックで解決したいのですが
良い方法は無いでしょうか?

試しにフックタイプを
WH_CALLWNDPROC
WH_GETMESSAGE
とこれらも試してみましたがNGでした。

なお、WH_JOURNALRECORDフックは
ユーザの操作でキャンセルされてしまうので
あまり使いたくありません。

経験者の方、アドバイス頂けると助かります。
宜しく御願いします。

A 回答 (1件)

 WM_MOUSEWHELLでwParamには何が入ってきてます?



 記憶を頼りに書いてますが下位ワードに押されているマウスボタン、上位ワードにホイールスクロール量が入ってたと思います。

 HIWORD(wParam)を調べて、+だったら上、-だったら下、あるいは逆(どっちか忘れました)。

この回答への補足

コメントありがとうございます。
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をサブクラス化するなどすることで
対応は可能なのですが
何分、数が多く、しかもそれが可変でして
かなり地道な作業になりそうです。

補足日時:2006/03/08 16:07
    • good
    • 0
この回答へのお礼

http://msdn.microsoft.com/library/default.asp?ur …

この構造体に欲しい情報が入ってくるようです。
ただ、WH_MOUSEタイプのフックをするだけでは
ダメかもしれません。
もう少し調べてみます。
ありがとうございました。

お礼日時:2006/03/08 16:43

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!