
かなり突っ込んだ質問かもしれませんが
Win32API系の質問です。
マウスホイールをフックするコードを書いています。
フックはDLLが必要なグローバルフックではなく
スレッドローカルなフックです。
具体的には
1.SetWindowsHookEx APIでWH_MOUSEタイプをフック
2.MouseProcフックプロシジャーでWM_MOUSEWHELLメッセージはフックできている。
ここまでは良いのですが
ホイールの回転方向がわかりません。
MouseProcフックプロシジャーのlParamを
MOUSEHOOKSTRUCT構造体へキャストしても
dwExtraInfo追加情報には何も入っておらず
(オールゼロでした。)
行き詰っています。
試しにフック後に
PeekMessageも試みましたがダメでした。
諸事情でグローバルフックは使いたくなくて
スレッドローカルなフックで解決したいのですが
良い方法は無いでしょうか?
試しにフックタイプを
WH_CALLWNDPROC
WH_GETMESSAGE
とこれらも試してみましたがNGでした。
なお、WH_JOURNALRECORDフックは
ユーザの操作でキャンセルされてしまうので
あまり使いたくありません。
経験者の方、アドバイス頂けると助かります。
宜しく御願いします。
No.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をサブクラス化するなどすることで
対応は可能なのですが
何分、数が多く、しかもそれが可変でして
かなり地道な作業になりそうです。
http://msdn.microsoft.com/library/default.asp?ur …
この構造体に欲しい情報が入ってくるようです。
ただ、WH_MOUSEタイプのフックをするだけでは
ダメかもしれません。
もう少し調べてみます。
ありがとうございました。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- 家具・インテリア 壁フック 3 2023/02/04 12:25
- 家具・インテリア 購入したカーテンが レールカーテンだと思わず 買ってしまいました。 一目惚れで買ったものなので 返品 5 2022/06/26 01:14
- 釣り あとずけのウエストフック 1 2022/09/14 13:02
- ボウリング A.J. Johnson選手の2フレーム目2投目(4:30〜)ですが、ボールがものすごくフック回転し 1 2023/02/13 19:34
- テレビ テレビ壁寄せスタンドの転倒防止方法は? 1 2022/04/17 23:11
- その他(買い物・ショッピング) 壁掛け金具の内容について 1 2022/05/30 21:52
- DIY・エクステリア 日除けのオーニングの隙間について 4 2022/06/25 15:06
- バッグ・財布 この紐の付け方 2 2023/07/17 14:59
- 団地・UR賃貸 賃貸の壁に画鋲刺したりフック貼ったりしてますか?これくらいなら綺麗に剥がせるかなーと思ってフック貼っ 1 2022/12/23 15:01
- レディース ズボンやスカートの着脱する際、ファスナーから下げて、フックやボタンを外しますか?それとも、フックやボ 1 2022/06/13 07:03
このQ&Aを見た人はこんなQ&Aも見ています
関連するカテゴリからQ&Aを探す
おすすめ情報
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
vbaから他のアプリを終了
-
VB.netでFindWindowExやると・...
-
msgboxの表示位置
-
他のウィンドウのボタンを自動...
-
メッセージボックスの選択ボタ...
-
メッセージハンドラ
-
SetWindowText関数について
-
チェックボックスのキーダウン...
-
タスクバーの並び替え
-
キーボード入力をHSPでさせたい...
-
VBでRegisterWindowMessage関数...
-
テキストボックスでコンテキス...
-
グローバルフックはDOS窓ではで...
-
VBA 複数セルが空白なら印刷さ...
-
デスクトップ上のアイコンの位...
-
VBAでコントロールのハンドルを...
-
VB.netでSendMessageを使用して...
-
コンソールからのメッセージボ...
-
DLL VB Wheel ホイール
-
WM_NCLBUTTONUPについて
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
vbaから他のアプリを終了
-
他のウィンドウのボタンを自動...
-
メッセージボックスの選択ボタ...
-
msgboxの表示位置
-
SendMessage で ESC など
-
VBAでコントロールのハンドルを...
-
SetWindowText関数について
-
VBA 複数セルが空白なら印刷さ...
-
点滅で知らせる方法
-
チェックボックスのキーダウン...
-
デスクトップ上のアイコンの位...
-
CloseHandle()
-
メッセージループについて
-
メッセージハンドラ
-
VB.netでSendMessageを使用して...
-
システム例外のメッセージを変...
-
Excel VBA で外部アプリケーシ...
-
マウスの右クリック+Shiftキー...
-
キーボード・フックのアプリを...
-
windowsメールスロットについて...
おすすめ情報