web-dev-qa-db-ja.com

無効にしませんが、スカルプトエルゴノミックマウスのWindowsボタンにXBUTTON2メッセージを送信させます(winapiの見通し)

予想どおり、すべてのマウスの2つの追加ボタンは、XBUTTON1およびXBUTTON2メッセージを送信します。ただし、Sculptエルゴノミックマウスでは、Windowsボタンはこれを送信しません。どうやらそれは正しいWindowsキーを送信します。 XBUTTON2を送信するように修正する必要があります。

これに従うことで、Windowsボタンが何もできないようにすることができました: Microsoft Sculptモバイルマウス(Windowsキー)を再バインド -しかし、これはマウスのWindowsボタンを完全に無効にし、次のように機能しません通常、他のすべての5ボタンマウスと同じです。 XBUTTON2を送信する必要があります。

ただし、XBUTTON2として機能するために必要です。

詳細な説明は次のとおりです。

私はソフトウェア開発者です。 Sculptエルゴノミックマウスは5つのボタン(および水平スクロール)があるため購入しました。これにより、すべてのボタンメッセージをテストできます。特に、タイプ/マウスを離している間、快適に保つのに役立ちます。

マウスフックのボタンメッセージは次のとおりです。 https://msdn.Microsoft.com/en-us/library/windows/desktop/ms644986.aspx

MouseDataフィールドは、マウスボタンに従って設定されます。

  • マウスの左ボタンを押すと、メッセージが送信されます:WM_LBUTTONDOWN
  • マウスの右ボタン:WM_RBUTTONDOWN
  • マウスの中ボタン:WM_MBUTTONDOWN
  • マウスのサイドボタン:WM_XBUTTONDOWNそしてMSLLHOOKSTRUCT構造に表示されます: https://msdn.Microsoft.com/en-us/library/windows/desktop/ms644970.aspx?f=255&MSPPError=- 2147217396 -そのmouseDataフィールドはXBUTTON1です
  • 現在、問題-Windowsのマウスボタンは何も送信していません-WM_XBUTTONDOWNのmouseDataでメッセージXBUTTON2を送信することを期待しています(2に注意してください)

箇条書きを説明する図は次のとおりです。

enter image description here

緑の矢印とテキストクラウドは、それがどのようであるかを示しており、それが私が期待していることです。赤い矢印とテキストクラウドは、Windowsのマウスボタンに期待することですが、そうではありません。誰かがこのWindowsマウスボタンをwinapiの観点から期待どおりに機能させるのを手伝ってくれますか?

1
Noitidart

「WIN」キーをリッスンしています

私の知る限り、「WIN」マウスキーからのイベントが表示されない唯一の理由は、マウス関連のイベントのみを表示しているのに対し、「WIN」キーはキーボード関連の「右」を生成するためです。 -Win」キーストローク。事実上、この部分はすでに コメントで説明されています –「Right-Win」の再マッピングは完全に機能します。

繰り返し送信されるRWinイベント

イベントを繰り返し送信していることが確認できます。 AFAIK、すべてのキーボードキーはこのように機能します-例: 「F2」。少なくとも次の [〜#〜] ahk [〜#〜]trick は、私が知る限り、「F2」と「RWin」の両方で事実上同じことを示しています。

#InstallKeybdHook
#InstallMouseHook
1::KeyHistory 

「WIN」キーの良いところは、機械的に単一のキーストロークを生成できることです。ホイールの傾きとは対照的に、ホイールの傾きから「シングルクリック」を得るのは非常に困難です。私の最短のクリックでさえ、通常3〜5回の個別のキーストロークとして扱われます。

ホイールチルトキーを聞く

「Microsoftマウスとキーボードセンター」(バージョン2.7.133.0)は、マウスの動作を変更しているようです。AHKはWheelRight/WheelLeftイベントを聞くことができなくなりました。 これを修正する最も簡単な方法 は、Microsoftのツールをアンインストールすることです。ただし、私の実験によれば、「WIN」キーには影響しません。

ただし、アンインストールしなくても、ホイールの傾きを再マップすることは可能です。 [〜#〜] ahkhid [〜#〜] 例1と2を使用することにより、UsagePage 12、Usage 1を使用して、左右のホイールの傾きから1FFDFFと1F0300の「データ」を取得できました。 「Microsoftマウスとキーボードセンター」がインストールされていますが、アンインストールしても何もありません。

繰り返し送信されるホイールチルトイベント

個人的には、 Bobが提案 のように、単に遅延を導入することになりました。 この質問 のコードに基づくと、最も単純なコードのように見えます(この場合は問題なく動作します(ただし、最適ではない可能性があります-私はAHKの専門家ではありません)。次のAHKスクリプトを使用すると、Wheel-tilt-Leftを「Ctrl + Alt + leftArrow」に、Wheel-tilt-Rightを「Ctrl + Alt + rightArrow」に再マップできます。 VirtuaWin でこれらのホットキーを使用して、前/次の仮想デスクトップに切り替えます(「クリックごとに1つの応答」が非常に重要なタスク)。これは完璧に機能します。 (それでも、「チルトボタン」を押し続けると、1秒あたり最大5つのイベントが発生します)。

WheelRight::
    if(  not GetKeyState("WheelRight")  )
        sleep 200    

    Send, {LControl down}
    Send, {LAlt down}
    Send, {right}
    Send, {LControl up}
    Send, {LAlt up} 
return


WheelLeft::     
    if(  not GetKeyState("WheelLeft")  )
        sleep 200

    Send, {LControl down}
    Send, {LAlt down}
    Send, {left}
    Send, {LControl up}
    Send, {LAlt up}
return        


RWin:: 
    Send, {Browser_Forward}
return

RWinは、このトリックがなくても問題なく動作します。

1
i3v

タイマーは、繰り返されるイベントを1つのアクションに減らすのに理想的です。キー/クリックを繰り返すたびにタイマー間隔をリセットするため、最終的にキー/ボタンを離すまでアクションは発生しません。

私はこのスクリプトをホイールチルトで使用します:

; Prevent warning if we hold a button too long
#MaxHotkeysPerInterval 200

~MButton & WheelRight::
    SetTimer ArrangeWindowRight, -50
return

~MButton & WheelLeft::
    SetTimer ArrangeWindowLeft, -50
return

ArrangeWindowRight:
    Send #{Right}
return

ArrangeWindowLeft:
    Send #{Left}
return

したがって、ArrangeWindowRightとArrangeWindowLeftは50msのみ呼び出されます傾斜を解除します(タイマー間隔の負の符号に注意して、1回だけ実行します。それがないと、関数が何度も呼び出されます)。

I3vのコードに関しては、一見すると、last繰り返しイベント(sleep 200 if wheel is not pressed anymore)の速度が低下しているように見えるので、そこで何が改善されたのか疑問に思います。また、5回の送信をSend ^!{Right}に減らすことができます。

乾杯!

1
Chema