先ほど、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);
}
開発環境はWinXP+VC6です。
HIWORD(pmsllhook ->mouseData)に入っているのは VK_・・・じゃなくて
XBUTTON1 又は XBUTTON2のはずですね。MSLLHOOKSTRUCTの説明を
確認してください。
また、クライアント外の場合のX-ボタンイベントは別のメッセージに
なります。ご注意ください(これも上記マニュアルに書いてあります)。
ちなみに、WM_XBUTTONDOWNが来ているのは確認しましたか(質問)。
>中澤様
VK_XBUTTON1はコンパイルが通らなかった為、自分で宣言し
値は「1」を入れていました。
(本来の値ではcase文に入らなかったので、デバッグし値を変更しました。)
WM_XBUTTONDOWNが来ているのは確認しました。
CallNextHookExを実行する前に何か必要なのでしょうか?
>VK_XBUTTON1はコンパイルが通らなかった為、自分で宣言し
>値は「1」を入れていました。
VK_XBUTTON1は最新のWin32SDKでは、まったく異なる用途の定義済みの
数値となっています。最新のSDKを手に入れましょう。自分で定義する
にしてもXBUTTON1を使うべきです。
ちなみに XBUTTON1とXBUTTON2を入れ替えるつもりならば、
case XBUTTON1:の時は次のようになると思うのですが、どうでしょう。
pmsllhook->mouseData
= (DWORD)MAKELONG( LOWORD( pmsllhook->mouseData), XBUTTON2);
ちなみにフックコードについてはご提示の部分だけ見ても何とも
答えようがありません。
「VC++6で使える最新のPlatformSDK」である点には注意が必要かも知れません。
複数のボタンが押された状態の場合に、HIWORD(pmsllhook->mouseData)にはどんな値がセットされるんでしょうかね?
# WM_XBUTTONUPの場合は…離された場合???
仕様的には…16ボタンまでのマウスに対応できる…んでしょうかねぇ……。
>複数のボタンが押された状態の場合に、HIWORD(pmsllhook->mouseData)にはどんな値がセットされるんでしょうかね?
XBUTTON1とXBUTTON2がフラグとしてORされることはありません。
むしろ、そのようなことをやっている人の指の健康が懸念されます(vv;)。
>中澤様
ご教授ありがとうございます。
case文の中を教えて頂いた
>  pmsllhook->mouseData
>       = (DWORD)MAKELONG( LOWORD( pmsllhook->mouseData), XBUTTON2);
に変更しましたが、動作は変わりませんでした。
>ちなみにフックコードについてはご提示の部分だけ見ても何とも
>答えようがありません。
マウスの「戻る」「進む」を入れ替えるにはマウスのローレベルフック
でボタンを入れ替えて、CallNextHookExに渡せば実現出来ると思ったので
フック処理のみ掲載致しました。
他にはどの部分が必要でしょうか?
(フックの設定・解除など?)
また文字化けしちゃいました。
文字化けした内容は
pmsllhook->mouseData = (DWORD)MAKELONG( LOWORD( pmsllhook->mouseData), XBUTTON2);
です。
しかし、なぜiPhoneから書き込むと一部だけ文字化けするのでしょうか?(−_−;)
フック機能実装での基本的なことを思いつくまま書くと
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;)。
>中澤様
コードを記載頂き有難うございます。
確認したところ、私のコードとほぼ差異はありませんでした。
4つの確認項目全て問題ありません。
コールバック関数(MouseProc)にわたされたlParamのアドレスの
中身のデータは変更できないのでしょうか?
ソフトレベルでは難しいのでしょうか…
このソフト作成は一時中断します。
アドバイスいただいた方、ありがとうございました。
ツイート | ![]() |