如何按住修饰键,以便 ahk 将按键发送到不同的窗口

问题描述

我对 ahk 还很陌生。

假设我打开了两个单独的 vlc 窗口并播放视频。

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

即,如果我按 Left,那么它会将 Left 发送到活动的 vlc 窗口,但是如果我按住 ALT+Left ,然后将 Left 发送到另一个 vlc 窗口。

如果没有 vlc 窗口处于活动状态,那么我不想让 autohotkey 做任何事情。

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

我查找了 GroupAdd,希望我可以使用一个包含两个 vlc 窗口的组,但找不到从组中定位特定 vlc 窗口以向其发送密钥的方法

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

GroupAdd,vlcgroup,ahk_exe vlc.exe
return

#IfWinActive ahk_exe vlc.exe
+Left::   ; shift-left
GroupActivate,r
Send {Left}
GroupActivate,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,^{Left},% "ahk_id " BottomMostVlcHwnd
return

...

#IfWinActive

你会写出每个热键。
WinGet,List(docs) 将遗留的硬件伪数组(docs) 返回到 Vlc 窗口。
该数组中的最后一个元素将是最底部的窗口。
您可以通过动态变量技巧 WindowList%WindowList% 获取伪数组的最后一个元素。
本质上,您正在访问一个名为 WindowListN 的变量,其中 N 是伪数组中最后一个元素的编号。

然后使用 ControlSend(docs) 将键发送到后台窗口,无需激活它。
并且您通过像 ahk_id 0x1234567(docs) 这样的窗口名称来引用背景窗口。


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

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

热键定义只是堆叠在一起。
(如果有更多定义,使用 Hotkey(docs) 命令的循环会更好)>

A_ThisHotkey(docs) 将包含使用的热键,而 StrReplace(docs) 用于自动用 + 替换 {
最后将右大括号 } 附加到末尾。