マウスのホイールボタンを取得するには

解決


Mr.SR  2005-04-14 06:10:39  No: 57001

マウスのホイールボタンを取得するにはどうしたら良いのでしょうか?
メッセージループ中でWM_MBUTTONDOWNなどで普通に出来ると思っていたのですが、実際にやってみたら何故か駄目でした。ネット上で調べたところこの方法でいけると書いたあったのですが、何か#defineしないといけないようなものでもあるのでしょうか?
VC++6.0でMFCは使っていませんが、DirectX8を使ったグラフィック系のアプリを作っています。


Azzy  2005-04-15 00:38:26  No: 57002

WM_MBUTTONDOWN は中央ボタンが押されたときに呼ばれます。

マウスのホイールボタンを取得するには WM_MOUSEWHEEL を処理します。

case WM_MOUSEWHEEL:
    if((short)HIWORD(wParam) > 0)
    {
        // ホイールを上方向にスクロールした
    }
    else
    if((short)HIWORD(wParam) < 0)
    {
        // ホイールを下方向にスクロールした
    }
    return 0;


Mr.SR  2005-04-15 01:43:18  No: 57003

あ、すみません。ちょっと書き方が紛らわしかったようです。中央ボタンを取得する方法を求めています。

ホイール:ぐるぐる回すやつ
ホイールボタン:中央ボタン
という意味合いでした。

で、現在左右ボタン(及びダブルクリック)・ホイールは問題なく取得できています。ただ同じ方法でWM_MBUTTONDOWNを使っても中央ボタンが取得できません。

色々試した結果、左右を押しっぱなしにしてホールを回すと上記WM_MOUSEWHEELの
LOWORD(wParam)にMK_MBUTTONのフラグが立つことは分かりました。もちろんそれでは意味がありませんが…

現在よく分からずに以下のように(適当に)#includeしているのですが、このあたりが問題でしょうか?
#define _WIN32_WINNT  (0x0400)
#define STRICT
#include <windows.h>


REE  2005-04-15 02:03:32  No: 57004

コントロールパネルのマウスで中央ボタンが無効になっていたり、他の機能に割り当てられていたりしないか確認してみるとか・・


Mr.SR  2005-04-15 21:39:01  No: 57005

上記の理由でした。

一応私も最初その理由だと思い、普段は「ブラウザの戻る」に割り当てている機能を「無効」にして試してみて駄目だったのですが、もう一度見直してみると「中央ボタン」という設定がありました。それにすると取得できました。お騒がせしました。有難うございます。

ただこれだとユーザーさんの環境によって動いたり動かなかったりするのでちょっと実用が難しいですね。一応調べてみるとDirectXのDirectInputなら実現できそうなのですが、皆さんがこれを使っているわけではないですよね。
普通にWin32APIだけの機能で、マウスの設定に関わらずホイールボタンを検出する方法は無いものでしょうか?


REE  2005-04-15 23:44:40  No: 57006

マウスの設定は、その使用者の意思で変えるものですから、
そのまま尊重した方がいいと思います。
そのアプリケーションでだけ、設定が無視されるようになってしまっては、
使用者が混乱します。

極端な例ですが、特定のアプリでだけ、左右のクリック機能が
逆になってしまうのを想像してみてください。


Mr.SR  2005-04-16 00:11:33  No: 57007

確かにそうですね。

実際に実装するかどうかはともかく、そういうことが可能かどうかだけでも知りたかったのですが、もうちょっと待って返答が無ければ解決にさせていただきます。


※返信する前に利用規約をご確認ください。

※Google reCAPTCHA認証からCloudflare Turnstile認証へ変更しました。






  このエントリーをはてなブックマークに追加