如何按住修改键以便 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) 用于自动将 +
替换为 {
.
最后将右大括号 }
附加到末尾。
我是 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) 用于自动将 +
替换为 {
.
最后将右大括号 }
附加到末尾。