Win XP Pro SP3
Microsoft Visual Studio 2008
C++でWindowsプログラミングしています。
システムフックを使用してマウスホイールのメッセージを受け取りたいです。
現在は
①SetWindowsHookExでWH_MOUSEタイプをフック。
②MouseHookProcでWM_MOUSEWHELLメッセージは受け取れている。
ですが回転方向が判別できません。
dll内で以下のように記述しています。
LRESULT CALLBACK MouseHookProc(int nCode, WPARAM wp, LPARAM lp){
_if( nCode < 0 || nCode == HC_NOREMOVE ){
__return CallNextHookEx( hMyHook, nCode, wp, lp );
_}
_if( wp == WM_MOUSEWHEEL ){
__if( int(msg->wParam) > 0){
___MessageBox(NULL, "AAA", "タイトル", MB_OK);
__}else{
___MessageBox(NULL, "BBB", "タイトル", MB_OK);
__}
_}
_return CallNextHookEx( hMyHook, nCode, wp, lp );
}
実行するとホイールの回転方向にかかわらず、
MessageBox(NULL, "AAA", "タイトル", MB_OK);
が実行されます。
if( int(msg->wParam) > 0) を
if( int(msg->lParam) > 0) に
変えるとホイールの回転方向にかかわらず、
MessageBox(NULL, "BBB", "タイトル", MB_OK);
が実行されます。
なぜなのでしょうか?
マニュアルを読みましょう(vv;)。
WM_MOUSEWHEELは
wParam : Hiはデルタ値 Loはキーフラグ
lParam : マウス位置
ですね。従ってwParamを丸ごと評価することはできませんよねぇ(笑)。
ちなみに、デルタ値がほしければGET_WHEEL_DELTA_WPARAM()マクロを
使うのが普通です。
MSG* msg = (MSG*)lp;
if( wp == WM_MOUSEWHEEL )
{
char str[256];
int hoge;
hoge = GET_WHEEL_DELTA_WPARAM(msg->wParam);
sprintf( str, "%d", hoge );
MessageBox(NULL, str, "タイトル", MB_OK);
}
としてみたら、回転方向に関わらず、
1が出てきました。やり方がおかしいのでしょうか?
ごめん。WH_MOUSEだったんですね(vv;)。これでホイールの
デルタ値がとれるかどうかは知りません。
WH_MOUSE_LLを使うと、取れると思います。自分の場合はこっちばっかし。
LowLevelMouseProc(
int nCode, // フックコード
WPARAM wParam, // メッセージ識別子
LPARAM lParam // メッセージデータ
){
if( wParam == WM_MOUSEWHEEL){
MSLLHOOKSTRUCT * Mll = ( MSLLHOOKSTRUCT *)lParam;
int WheelDelta = GET_WHEEL_DELTA_WPARAM( Mll->mouseData);
}
}
てな感じ。デルタ値は120が基数です。
WH_MOUSE_LLを使うことでデルタ値の取得ができました。
MessageBoxで確認したら、上回転が120で、下回転が-120と出ました。
仲澤@失業者さんありがとうございました。