3

「マウスの右ボタンを押してから、マウスの左ボタンを押した」というキーイベントをキャプチャしたいと思います。自動ホットキーでは問題ありません。ただし、右マウスキーを単独で機能させるのに問題があります。

1)これは機能します:

RButton & LButton::
    Send X
Return

期待どおりに動作します:

  • マウスの右ボタンを押してからマウスの左ボタンを押すと、アクティブなウィンドウに「X」が送信されます
  • 右クリックイベントはAuthotkeyによってキャプチャされます。マウスの右ボタンだけを押してもコンテキストメニューは表示されません。これは意図された結果です

2)これは機能します

~RButton & LButton::
    Send Y
Return

期待どおりに動作します:

  • マウスの右ボタンを押してからマウスの左ボタンを押すと、アクティブなウィンドウに「Y」が送信されます
  • 右クリックイベントはAuthotkeyによってキャプチャされません。マウスの右ボタンを単独で押すか、左ボタンと一緒に押すと、コンテキストメニューが表示されます。これは意図された結果です

3)アクティブなウィンドウに応じて異なることをしたいと思います。

これは機能しません(注意:これにより、すべてのアプリケーションで右クリックが無効になります)

#If WinActive("ahk_class MozillaWindowClass")

RButton & LButton::
    Send X
Return


#If !WinActive("ahk_class MozillaWindowClass")
~RButton & LButton::
    Send Y
Return

期待どおりに機能しません:

  • Firefoxでは左右がXを送信し、他のアプリケーションでは左右がYを送信します
  • ただし、すべてのアプリケーションで右クリックは無効になっています

私はここで何が間違っているのですか?


編集:

目標は次のとおりです。右+左クリックでグローバルホットキーが必要ですRButton & LButton。互換性をテストした特定のアプリケーションでは、右クリックと左クリックで右クリックの送信を抑制してから、オートホットキーを使用して手動で右クリックを送信します。ただし、一部のアプリケーションでは、autohotkeyによって送信されたマウスイベントの処理に問題が発生する可能性があるため、テストされていないすべてのアプリケーション~RButton & LButtonで、〜を使用して右クリックイベントを通過させたいと考えています。

4

1 に答える 1

3

これが右クリックドラッグをサポートするものです!

Hotkey, LButton, off

#IfWinActive ahk_class MozillaWindowClass
RButton & LButton::
    Send X
Return

RButton::return

#IfWinNotActive ahk_class MozillaWindowClass
~$RButton::
Hotkey, LButton, on
while GetKeyState("RButton", "P") {
    continue
    }
Hotkey, LButton, off
Return

LButton::Send Y
Return

手動で処理しRButtonます。をRButton押すと、ホットキーが有効になり、解放されるLButtonのを待ってから非アクティブになります。ホットキーは、を使用します。RButtonこれは通常、クリックスルーを通過させます。RButton~

LButton一番上の行で最初は無効になっています。

{RButton Down}別の方法は、ホットキーの開始時と終了時に送信することでした{RButton Up}

編集に応じて、Autohotkeyの送信されたイベントを拒否するプログラムは、低レベルのフックに依存するプログラムのみである必要があります...下部にあるメソッドの本当の問題は、ボタンを押したまま処理するのではなく、シングルクリックのみを送信することです。この方法と、ダウンとアップを別々に送信することは、両方とも適切に行う必要があります。

この回答の下部に記載されているアクティブウィンドウのバグはまだ存在しますが、それはの問題#IfWin[Not]Activeです。


古いもの

アンパサンド(強調鉱山)に関するドキュメントを参照してください。

2つのキー(ジョイスティックボタンを除く)の間に「&」を使用して、それらのカスタムの組み合わせを定義できます。次の例では、Numpad0を押したまま、2番目のキーを押してホットキーをトリガーします。

Numpad0 & Numpad1::MsgBox You pressed Numpad1 while holding down Numpad0.
Numpad0 & Numpad2::Run Notepad

上記の例では、Numpad0がプレフィックスキーになります。ただし、これにより、Numpad0がそれ自体で押されたときに、元の/ネイティブの機能が失われます。これを回避するために、スクリプトは、次のいずれかのような新しいアクションを実行するようにNumpad0を構成する場合があります。

Numpad0::WinMaximize A   ; Maximize the active/foreground window.
Numpad0::Send {Numpad0}  ; Make the release of Numpad0 produce a Numpad0 keystroke. See comment below.

上記のホットキーのいずれかが存在すると、Numpad0が解放されて指示されたアクションが実行されますが、Numpad0が押されている間に他のキーを押さなかった場合に限ります。

したがって、その例に従ってください。

#If WinActive("ahk_class MozillaWindowClass")

RButton & LButton::
    Send X
Return

RButton::return

#If !WinActive("ahk_class MozillaWindowClass")
RButton & LButton::
    Send Y
Return

RButton::Send {RButton}

注には、少なくとも私のテストでRButtonは何もしないバリアントが必要です(以下を参照)。WinActiveRButton::return


Autohotkey_LではなくAutohotkey標準を使用しているので、持っていません#If。上記はテストされていません。次のテストを行いましたが、動作します

#IfWinActive ahk_class MozillaWindowClass
RButton & LButton::
    Send X
Return

RButton::return


#IfWinNotActive ahk_class MozillaWindowClass
RButton & LButton::
    Send Y
Return

RButton::Send {RButton}

私が気付いた興味深いバグは、2番目の(NotActive)バリアントがFirefoxに時々適用されることです。

  1. 別のウィンドウがアクティブです
  2. RButton ダウンが送信されます
  3. Firefoxはアクティブではないため、2番目のバリアントが処理されます
  4. <delay>(RButtonミリ秒のオーダーで、無限に遅延が認識できない場合もありますが、押し続けられます)
  5. Firefoxがアクティブになります
  6. <遅延>(まだ押し続けている)
  7. RButton upが送信RButtonされ、ドキュメントに従って送信されます。RButtonFirefoxは、アクティブなウィンドウチェックから送信されるまでの遅延でアクティブになったため、FirefoxにRButton送信されます。

これは、Firefoxと別のウィンドウの両方が表示されていて、クリック時にもう一方のウィンドウがアクティブな場合に発生します。

IfWinNotActiveホットキー内にチェックを追加してこのバグを修正しようとしましたRButtonが、機能していないようです。

于 2012-04-25T11:05:50.597 に答える