首页 > 解决方案 > 如何按住修改键,以便 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, vlcgroup, r
Send {Left}
GroupActivate, vlcgroup, r
return

标签: autohotkey

解决方案


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

#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)将 hwnds的遗留伪数组(docs)返回到 Vlc 窗口。
该数组中的最后一个元素将是最底部的窗口。
您可以通过动态变量技巧获取伪数组的最后一个元素WindowList%WindowList%
本质上,您正在访问一个名为 的变量WindowListN,其中N是伪数组中最后一个元素的编号。

然后ControlSend(docs)用于将密钥发送到后台窗口而无需激活它。并且您通过(docs)
之类的窗口名称来引用背景窗口。ahk_id 0x1234567


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

#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)将包含使用的热键,并且StrReplace(docs)用于自动将 替换+{.
最后,右大括号}附加到末尾。


推荐阅读