如何按住修改键以便 ahk 将按键发送到不同的 window

How to hold a modifier key so ahk sends keypresses to a different window

我是 ahk 的新手。

假设我有两个单独的 vlc windows 打开和播放视频。

如果其中一个 vlc windows 处于活动状态,那么我希望能够按住一个键以使所有按键都转到另一个 vlc window。

即如果我按下 Left,然后它发送 Left 到活动的 vlc window,但是如果我按住 ALT+Left,然后发送Left到另一个vlc window.

如果没有激活的 vlc window,那么我不想让 autohotkey 做任何事情。

这样我就可以控制两个 vlc windows,而无需单击并选择哪个处于活动状态。

我查找了 GroupAdd 希望我可以使用包含两个 vlc windows 的组,但找不到从组中定位特定 vlc windows 的方法来发送它的键。

编辑:我得到了一个非常基本的版本,但我觉得它很丑陋。如果你按住 Shift 到另一个 vlc window,我想要一种方法来发送任何按下的键。另外,如果连续快速使用几次,切换焦点似乎有点不可靠。

GroupAdd, vlcgroup, ahk_exe vlc.exe
return

#IfWinActive ahk_exe vlc.exe
+Left::   ; shift-left
GroupActivate, vlcgroup, r
Send {Left}
GroupActivate, vlcgroup, r
return

一个简单的方法可以这样完成:

#IfWinActive, ahk_exe vlc.exe
+Left::
    WinGet, WindowList, List, ahk_exe vlc.exe
    BottomMostVlcHwnd := WindowList%WindowList% 
    ControlSend, , {Left}, % "ahk_id " BottomMostVlcHwnd
return

^+Left::
    WinGet, WindowList, List, ahk_exe vlc.exe
    BottomMostVlcHwnd := WindowList%WindowList% 
    ControlSend, , ^{Left}, % "ahk_id " BottomMostVlcHwnd
return

...

#IfWinActive

你会写出每个热键。
WinGet, , List(docs) returns a legacy pseudo-array(docs) 到 Vlc 的 hwnds windows.
该数组中的最后一个元素将是最底部的 window.
您可以通过动态变量技巧 WindowList%WindowList%.
获取伪数组的最后一个元素 本质上,您正在访问一个名为 WindowListN 的变量,其中 N 是伪数组中最后一个元素的编号。

然后ControlSend(docs)用于后台发送密钥window不需要激活
并且您通过 window 名称引用背景 window,例如 ahk_id 0x1234567(docs).


当然,为每个键写出热键是相当重复的,所以我们可以做一些更好的事情:

#IfWinActive, ahk_exe vlc.exe
+Left::
^+Left::
+Right::
^+Right::
+PgUp::
+PgDn::
    WinGet, WindowList, List, ahk_exe vlc.exe
    ControlSend, , % StrReplace(A_ThisHotkey, "+", "{") "}", % "ahk_id " WindowList%WindowList%
return
#IfWinActive

热键定义相互堆叠。
(如果有更多的定义,使用 Hotkey(docs) 命令的循环会更好)

A_ThisHotkey(docs) will contain the hotkey that was used, and StrReplace(docs) 用于自动将 + 替换为 {.
最后将右大括号 } 附加到末尾。