【システムフック】マウスホイールの回転方向

解決


cpp_q  2010-09-09 12:28:18  No: 71924  IP: [192.*.*.*]

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);
が実行されます。

なぜなのでしょうか?

編集 削除
仲澤@失業者  2010-09-09 12:49:46  No: 71925  IP: [192.*.*.*]

マニュアルを読みましょう(vv;)。
WM_MOUSEWHEELは
  wParam  : Hiはデルタ値 Loはキーフラグ
  lParam  : マウス位置
ですね。従ってwParamを丸ごと評価することはできませんよねぇ(笑)。
ちなみに、デルタ値がほしければGET_WHEEL_DELTA_WPARAM()マクロを
使うのが普通です。

編集 削除
cpp_q  2010-09-09 15:06:55  No: 71926  IP: [192.*.*.*]

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が出てきました。やり方がおかしいのでしょうか?

編集 削除
仲澤@失業者  2010-09-09 15:43:55  No: 71927  IP: [192.*.*.*]

ごめん。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が基数です。

編集 削除
cpp_q  2010-09-13 11:10:50  No: 71928  IP: [192.*.*.*]

WH_MOUSE_LLを使うことでデルタ値の取得ができました。
MessageBoxで確認したら、上回転が120で、下回転が-120と出ました。
仲澤@失業者さんありがとうございました。

編集 削除