问题描述
我对 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) 用于自动用 +
替换 {
。
最后将右大括号 }
附加到末尾。