如何强制 Windows 忽略 AutoHotKey 并将该热键直接传递给活动窗口?

Posted

技术标签:

【中文标题】如何强制 Windows 忽略 AutoHotKey 并将该热键直接传递给活动窗口?【英文标题】:How do I force Windows to ignore an AutoHotKey and instead pass that hotkey directly to the active window? 【发布时间】:2019-09-01 22:45:59 【问题描述】:

我的 cPanel 有一个文本编辑器,它允许使用 Ctrl-Alt-Up、Ctrl-Alt-Down、Ctrl-Alt-Right 和 Ctrl-Alt-Left 实现多光标功能。不幸的是,Windows 为这些组合键提供了默认热键,可以旋转屏幕上的显示。当我尝试在文本编辑器中使用这些组合键时,Windows 会在它们进入活动窗口之前劫持它们。

我首先搜索是否有任何相当简单的方法可以关闭特定的 Windows 默认热键。我的搜索只找到了关闭所有热键的结果。然后我决定下载 AutoHotKeys 看看我是否可以编写一个脚本来实现我想要做的事情。以下是一些示例;我会坚持使用 Ctrl-Alt-Right 来选择四个中的一个:

第一个代码块在所有 4 次尝试中都相同

#NoEnv
SendMode Input
SetWorkingDir %A_ScriptDir%
SetTitleMatchMode, 2      ;this and the next line should only perform the scripted
#IfWinActive Opera        ;hotkey if the active window's title contains 'Opera'

尝试 1:热键正确绕过 Windows 默认显示旋转操作,并将击键发送到 Opera 中的文本编辑器。但是,文本编辑器在光标所在的位置输入字符串“ight”。文本编辑器中没有 Ctrl-Alt-R 热键,也不能是 Windows 默认热键。所以它将 Ctrl-Alt-R 发送到 Opera,它什么也不做。然后它发送输入的“ight”。 (这是4次尝试中“最成功”的一次,但绝对没有达到预期的结果):

^!Right::
Send, ^!Right
return

尝试 2:仅与 #1 不同,使用 SendPlay 而不是 Send。热键再次正确绕过 Windows 默认显示旋转操作。但是,文本编辑器似乎根本没有做任何事情:

^!Right::
SendPlay, ^!Right
return

尝试 3:回到刚才的 Send,但现在在第二个“Right”周围加上花括号。现在热键甚至没有绕过 Windows 默认的显示旋转操作(这真的让我大吃一惊,因为我原以为尝试 #1 的结果证明找到了活动的 Opera 窗口并且击键 Ctrl-Alt-Right 是正确的被第一行的^!Right 读取。我很困惑为什么在第二行添加花括号会否定这些似乎应该已经发生的事情):

^!Right::
Send, ^!Right
return

尝试 4:仅与 #3 不同,使用 SendPlay 而不是 Send。热键再次正确绕过 Windows 默认显示旋转操作。但是,文本编辑器似乎根本没有做任何事情:

^!Right::
SendPlay, ^!Right
return

总结

----------|  Curly Braces    |       No Curly Braces       |
----------|------------------|-----------------------------|
Send      | Win Dflt Action  | types "ight" in text editor |
SendPlay  |   no action      |        no action            |

所以这是最后一个问题,根据这张表,在我看来Send 绝对是要走的路。如果(如尝试 3 所示)花括号导致显示旋转,如何在不被 Windows 劫持的情况下将此击键发送到活动窗口?显然,#IfWinActive Opera 在不使用花括号时可以正常工作。也许还有另一个指令可以完全阻止或绕过 Windows 的默认操作?

【问题讨论】:

【参考方案1】:

如果您不希望拥有屏幕旋转功能,可以在图形面板中禁用此功能。我相信它与英特尔图形应用程序有关。可能类似于,右键单击桌面,选择图形选项,选择热键,然后单击禁用。这只是猜测,因为我正在使用的计算机上没有它,但我以前在别人的计算机上遇到过。

至于您的热键,您需要在“right”一词周围加上花括号,否则它只会发送单个字符,就像实际键入它一样。另一个问题是你的热键前面需要一个$,因为它是自引用的;也就是说,它发送的按键与激活它的按键相同。

如果您没有机会查看帮助文件,我绝对推荐它。 https://www.autohotkey.com/docs/Hotkeys.htm#Symbols

【讨论】:

英特尔显卡正是问题所在。我不知道你是怎么知道的。无论如何,它就像一个魅力!感谢您提供有关自引用的附加信息。 在 Windows 10 中非常有用,可以停止 Ctrl+Alt+right 和 Ctrl+Alt+Left 屏幕旋转。尽管 Gpedit.msc 编辑(在其他地方)关闭热键,这完全有效。 Windows 10 教育版。现在,VirtualWin 热键就像冠军一样工作。

以上是关于如何强制 Windows 忽略 AutoHotKey 并将该热键直接传递给活动窗口?的主要内容,如果未能解决你的问题,请参考以下文章

如何忽略 SIGKILL 或强制进程进入“D”睡眠状态?

如何强制 WKWebView 忽略 iOS 上的硬件静音开关?

如何强制 ListView 忽略单击/不突出显示单击的项目?

如果通过,如何强制 Mongoose 忽略 __v?

如何告诉 OkHttpClient 忽略缓存并从服务器强制刷新?

如何强制 Django 忽略任何缓存并重新加载数据?