【问题标题】:How to hold a modifier key so ahk sends keypresses to a different window如何按住修改键,以便 ahk 将按键发送到不同的窗口
【发布时间】:2021-10-01 04:03:32
【问题描述】:

我对 ahk 很陌生。

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

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

ie 如果我按下 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

【问题讨论】:

  • 请添加一些关于您自己尝试做的事情的信息(即使用Google: autohotkey send to specific window 的输出)
  • 我用谷歌搜索了一堆东西,但没有找到任何方法来定位组中的特定窗口。
  • 请澄清“组中的特定窗口”,edit 您的问题,并将其设置为具有 2 个窗口的 minimal reproducible example,其中第一个窗口对按键做出反应
  • 使用groupadd,例如,我可以创建一组窗口并将它们全部最小化为一个组,但我不知道如何仅针对组中的特定窗口。显然我不需要 ahk 将按键发送到活动窗口。所以最小的可复制示例根本不需要 ahk。问题的重点是我不知道如何让 ahk 将密钥发送到另一个 vlc 窗口。
  • 您希望使用哪些键来完成这项工作?有很多具有不同键名的边缘情况,因此必须以特殊方式处理它们。另外,它应该与组合键一起使用吗?就像 shift + ctrl + a 会将 ctrl + a 发送到第二个 vlc 窗口。

标签: autohotkey


【解决方案1】:

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

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

然后ControlSend(docs) 用于将密钥发送到后台窗口而不需要激活它。
而你通过像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) 将包含使用的热键,StrReplace(docs) 用于自动将+ 替换为@ 987654340@.
最后将右大括号 } 附加到末尾。

【讨论】:

  • 太棒了!完美,效果很好。非常感谢。一个问题 - 脚本中是否需要最后的#IfWinActive?如果是这样,它有什么作用?
  • 结束上下文相关的热键块。所以下面的其他热键不会是上下文敏感的。假设您在这些热键之下没有其他热键,它真的没有任何用途,但实际上,请保留它,因为它属于那里。
  • 现在我意识到我的另一个脚本中存在这个问题,这就是热键不起作用的原因!
猜你喜欢
  • 1970-01-01
  • 2011-08-12
  • 1970-01-01
  • 2011-11-27
  • 1970-01-01
  • 1970-01-01
  • 2019-05-19
  • 2014-03-19
  • 2022-10-19
相关资源
最近更新 更多