マウスの「戻る」「進む」を入れ替えるには?


2tom  2011-05-31 00:21:26  No: 72678  IP: 192.*.*.*

先ほど、iPhoneから投稿したら文字化けしてしまったので、再度投稿致します。

現在、マウスのローレベルフックを使用して
マウスの「戻る」と「進む」を入れ替えるアプリを
作成しています。
フックで、ボタン押下を拾う事は出来たのですが、
入れ替えることができません。
ご教授宜しくお願いします。

以下、フック処理のコードです。

LRESULT CALLBACK MouseProc(int nCode, WPARAM wParam, LPARAM lParam) 
{
    BOOL bHandle = FALSE; 
    MSLLHOOKSTRUCT *pmsllhook = (MSLLHOOKSTRUCT *)lParam; 

    if (nCode == HC_ACTION) { 
        switch (wParam) 
        { 
        case WM_XBUTTONUP: 
        case WM_XBUTTONDOWN: 
            switch (HIWORD(pmsllhook ->mouseData)) 
            { 
            case VK_XBUTTON1: 
                // たっているビットを落とす 
                pmsllhook->mouseData &= ~VK_XBUTTON1 << 16; 
                // XBUTTON2のメッセージをセットする 
                pmsllhook->mouseData |= VK_XBUTTON2 << 16; 
                break; 

            case VK_XBUTTON2: 
                // ビットを落とす 
                pmsllhook->mouseData &= ~VK_XBUTTON2 << 16; 
                // XBUTTON1のメッセージをセットする 
                pmsllhook->mouseData |= VK_XBUTTON1 << 16; 
                break; 
            }
            break; 

        default: 
            break; 
        } 
    }

    return CallNextHookEx(hHook2, nCode, wParam, lParam); 
}

編集 削除
2tom  2011-05-31 00:36:15  No: 72679  IP: 192.*.*.*

開発環境はWinXP+VC6です。

編集 削除
仲澤@失業者  2011-05-31 09:58:23  No: 72680  IP: 192.*.*.*

HIWORD(pmsllhook ->mouseData)に入っているのは VK_・・・じゃなくて
XBUTTON1 又は XBUTTON2のはずですね。MSLLHOOKSTRUCTの説明を
確認してください。
また、クライアント外の場合のX-ボタンイベントは別のメッセージに
なります。ご注意ください(これも上記マニュアルに書いてあります)。

ちなみに、WM_XBUTTONDOWNが来ているのは確認しましたか(質問)。

編集 削除
2tom  2011-05-31 12:35:48  No: 72681  IP: 192.*.*.*

>中澤様

VK_XBUTTON1はコンパイルが通らなかった為、自分で宣言し
値は「1」を入れていました。
(本来の値ではcase文に入らなかったので、デバッグし値を変更しました。)

WM_XBUTTONDOWNが来ているのは確認しました。

CallNextHookExを実行する前に何か必要なのでしょうか?

編集 削除
仲澤@失業者  2011-05-31 14:16:23  No: 72682  IP: 192.*.*.*

>VK_XBUTTON1はコンパイルが通らなかった為、自分で宣言し
>値は「1」を入れていました。
VK_XBUTTON1は最新のWin32SDKでは、まったく異なる用途の定義済みの
数値となっています。最新のSDKを手に入れましょう。自分で定義する
にしてもXBUTTON1を使うべきです。
ちなみに XBUTTON1とXBUTTON2を入れ替えるつもりならば、
case XBUTTON1:の時は次のようになると思うのですが、どうでしょう。
  pmsllhook->mouseData
       = (DWORD)MAKELONG( LOWORD( pmsllhook->mouseData), XBUTTON2);
ちなみにフックコードについてはご提示の部分だけ見ても何とも
答えようがありません。

編集 削除
瀬戸っぷ  2011-05-31 16:31:05  No: 72683  IP: 192.*.*.*

「VC++6で使える最新のPlatformSDK」である点には注意が必要かも知れません。

複数のボタンが押された状態の場合に、HIWORD(pmsllhook->mouseData)にはどんな値がセットされるんでしょうかね?
# WM_XBUTTONUPの場合は…離された場合???

仕様的には…16ボタンまでのマウスに対応できる…んでしょうかねぇ……。

編集 削除
仲澤@失業者  2011-05-31 18:32:53  No: 72684  IP: 192.*.*.*

>複数のボタンが押された状態の場合に、HIWORD(pmsllhook->mouseData)にはどんな値がセットされるんでしょうかね?

XBUTTON1とXBUTTON2がフラグとしてORされることはありません。
むしろ、そのようなことをやっている人の指の健康が懸念されます(vv;)。

編集 削除
2tom  2011-05-31 19:19:25  No: 72685  IP: 192.*.*.*

>中澤様
ご教授ありがとうございます。
case文の中を教えて頂いた
>&#160;&#160;pmsllhook->mouseData
>&#160;&#160;&#160;&#160;&#160;&#160;&#160;=&#160;(DWORD)MAKELONG(&#160;LOWORD(&#160;pmsllhook->mouseData),&#160;XBUTTON2);
に変更しましたが、動作は変わりませんでした。

>ちなみにフックコードについてはご提示の部分だけ見ても何とも
>答えようがありません。
マウスの「戻る」「進む」を入れ替えるにはマウスのローレベルフック
でボタンを入れ替えて、CallNextHookExに渡せば実現出来ると思ったので
フック処理のみ掲載致しました。
他にはどの部分が必要でしょうか?
(フックの設定・解除など?)

編集 削除
2tom  2011-05-31 23:59:28  No: 72686  IP: 192.*.*.*

また文字化けしちゃいました。
文字化けした内容は

pmsllhook->mouseData =&#160;(DWORD)MAKELONG(&#160;LOWORD(&#160;pmsllhook->mouseData),&#160;XBUTTON2);

です。
しかし、なぜiPhoneから書き込むと一部だけ文字化けするのでしょうか?(−_−;)

編集 削除
仲澤@失業者  2011-06-01 10:35:53  No: 72687  IP: 192.*.*.*

フック機能実装での基本的なことを思いつくまま書くと
1.実装はDLLに行わなければならない。
2.フックのインストールは
    HHOOK hh=SetWindowsHookEx(
           WH_MOUSE_LL,(HOOKPROC)MouseProc,hDll,0);
3.フックの解除は
    UnhookWindowsHookEx(hh);
4.フックプロシージャは
  LRESULT CALLBACK MouseProc(
     int nCode,WPARAM wParam,LPARAM lParam)
  {  if(nCode<0||nCode==HC_NOREMOVE){
       return CallNextHookEx(
        g_hHookMouseWnd, nCode, wParam, lParam);
     }
     MSLLHOOKSTRUCT  * lp = (MSLLHOOKSTRUCT  *)lParam;
     if( nCode == HC_ACTION ){
        switch(wParam){
           //処理を書く
        }
      }
      return CallNextHookEx(
          hh, nCode, wParam, lParam); //次のフックを呼ぶ
  }
等ですね。まぁやってるとは思いますが。
一応確認しましょう(vv;)。

編集 削除
2tom  2011-06-01 19:18:26  No: 72688  IP: 192.*.*.*

>中澤様

コードを記載頂き有難うございます。
確認したところ、私のコードとほぼ差異はありませんでした。
4つの確認項目全て問題ありません。

コールバック関数(MouseProc)にわたされたlParamのアドレスの
中身のデータは変更できないのでしょうか?

編集 削除
2tom  2011-06-16 23:43:28  No: 72689  IP: 192.*.*.*

ソフトレベルでは難しいのでしょうか…
このソフト作成は一時中断します。

アドバイスいただいた方、ありがとうございました。

編集 削除