我如何强制 Windows 忽略 AutoHotKey 并将该热键直接传递给活动的 window?
How do I force Windows to ignore an AutoHotKey and instead pass that hotkey directly to the active window?
我的 cPanel 有一个文本编辑器,允许使用 Ctrl-Alt-Up、Ctrl-Alt-Down、Ctrl-Alt-Right 和 Ctrl-Alt-Left 的多光标功能。不幸的是,Windows 为这些旋转屏幕显示的组合键提供了默认热键。当我尝试在文本编辑器中使用这些组合键时,Windows 在它们到达活动 window 之前劫持了它们。
我首先搜索以查看是否有任何相当简单的方法来关闭特定的 Windows 默认热键。我的搜索只出现了关闭所有热键的结果。然后我决定下载 AutoHotKeys 并看看我是否可以编写一个脚本来实现我想要做的事情。以下是一些例子;我会坚持使用 Ctrl-Alt-Right 只是为了 select 四分之一:
第一个代码块在所有 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,Opera 什么也不做。然后它发送 "ight" ,这是打出来的。 (这是4次尝试中的"most successful",但肯定没有达到预期的效果):
^!Right::
Send, ^!Right
return
尝试 2:与 #1 的唯一区别是 SendPlay
而不是 Send
。热键再次正确绕过 Windows 默认显示旋转操作。但是,文本编辑器似乎根本没有做任何事情:
^!Right::
SendPlay, ^!Right
return
尝试 3:回到 Send
,但现在在第二个 "Right" 周围加上大括号。现在热键甚至没有绕过 Windows 默认的显示旋转操作(这真的让我感到困惑,因为我认为尝试 #1 的结果证明找到了活动的 Opera window 并且第一行中的 ^!Right
正确读取了击键 Ctrl-Alt-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 |
所以这是最后一个问题,基于这个table,在我看来Send
绝对是可行的方法。如果(如尝试 3 所示)花括号导致显示旋转,我如何将此击键发送到活动 window 而不会 Windows 劫持它?显然, #IfWinActive Opera
在不使用大括号时可以正常工作。也许还有另一个指令可以完全阻止或绕过 Windows' 默认操作?
如果您不希望使用屏幕旋转功能,可以在您的图形面板中将其禁用。我相信它与英特尔图形应用程序有关。可能类似于,右键单击桌面,select 图形选项,选择热键,然后单击禁用。这只是猜测,因为我正在使用的计算机上没有它,但我以前在其他人的计算机上遇到过它。
至于您的热键,您需要用花括号将“正确”一词括起来,否则它只会发送单个字符,就像实际键入它一样。另一个问题是您需要在热键前加一个 $
,因为它是自引用的;也就是说,它发送与激活它相同的击键。
如果您还没有机会查看帮助文件,我绝对推荐它。
https://www.autohotkey.com/docs/Hotkeys.htm#Symbols
我的 cPanel 有一个文本编辑器,允许使用 Ctrl-Alt-Up、Ctrl-Alt-Down、Ctrl-Alt-Right 和 Ctrl-Alt-Left 的多光标功能。不幸的是,Windows 为这些旋转屏幕显示的组合键提供了默认热键。当我尝试在文本编辑器中使用这些组合键时,Windows 在它们到达活动 window 之前劫持了它们。
我首先搜索以查看是否有任何相当简单的方法来关闭特定的 Windows 默认热键。我的搜索只出现了关闭所有热键的结果。然后我决定下载 AutoHotKeys 并看看我是否可以编写一个脚本来实现我想要做的事情。以下是一些例子;我会坚持使用 Ctrl-Alt-Right 只是为了 select 四分之一:
第一个代码块在所有 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,Opera 什么也不做。然后它发送 "ight" ,这是打出来的。 (这是4次尝试中的"most successful",但肯定没有达到预期的效果):
^!Right::
Send, ^!Right
return
尝试 2:与 #1 的唯一区别是 SendPlay
而不是 Send
。热键再次正确绕过 Windows 默认显示旋转操作。但是,文本编辑器似乎根本没有做任何事情:
^!Right::
SendPlay, ^!Right
return
尝试 3:回到 Send
,但现在在第二个 "Right" 周围加上大括号。现在热键甚至没有绕过 Windows 默认的显示旋转操作(这真的让我感到困惑,因为我认为尝试 #1 的结果证明找到了活动的 Opera window 并且第一行中的 ^!Right
正确读取了击键 Ctrl-Alt-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 |
所以这是最后一个问题,基于这个table,在我看来Send
绝对是可行的方法。如果(如尝试 3 所示)花括号导致显示旋转,我如何将此击键发送到活动 window 而不会 Windows 劫持它?显然, #IfWinActive Opera
在不使用大括号时可以正常工作。也许还有另一个指令可以完全阻止或绕过 Windows' 默认操作?
如果您不希望使用屏幕旋转功能,可以在您的图形面板中将其禁用。我相信它与英特尔图形应用程序有关。可能类似于,右键单击桌面,select 图形选项,选择热键,然后单击禁用。这只是猜测,因为我正在使用的计算机上没有它,但我以前在其他人的计算机上遇到过它。
至于您的热键,您需要用花括号将“正确”一词括起来,否则它只会发送单个字符,就像实际键入它一样。另一个问题是您需要在热键前加一个 $
,因为它是自引用的;也就是说,它发送与激活它相同的击键。
如果您还没有机会查看帮助文件,我绝对推荐它。 https://www.autohotkey.com/docs/Hotkeys.htm#Symbols