为什么Visual Studio在autohotkey之前捕获关键事件?
我最近切换到Dvorak键盘布局作为一个实验的一点点。 过渡中最困难的部分之一就是处理热键。 大多数热键在devise时都考虑到了QWERTY,而且更糟的是,热键似乎是非常有肌肉记忆力的。
我没有重新学习所有的热键,而是编写了一个autohotkey脚本,当Ctrl 键 , Alt键或者Win键与其他键联合使用时,可以将Dvorak格式转换回QWERTY格式。 除了Visual Studio '08之外,它在任何地方都可以运行。 在autohotkey可以翻译它们之前,似乎击键被捕获。
为什么会发生这种情况,我该如何解决这个问题?
以下是我的脚本的摘录(从一开始):
; control + letter ^;::^z ^q::^x ^j::^c ^k::^v
更新:脚本在ah7,vs08和coderush新安装的Win7上正常工作。 我遇到麻烦的机器正在运行Vista。 任何想法如何进一步诊断?
更新2:该脚本工作正常与Vista和2010testing版2似乎是与08 + Vista的东西。 今晚要尝试一下vs08的全新安装。
啊哈! 我已经知道了。 如果ahk和目标应用程序没有在相同的特权(或用户)下运行,ahk将不会正确地拦截/模拟键盘事件。 在我的情况下,视觉工作室是以pipe理员(提升的)特权运行,而ahk脚本是以当前login的用户身份运行的。
下面的任何一个解决了这个问题:
- 作为当前用户运行vs和ahk
- 编译脚本并以pipe理员身份运行vs和编译的应用程序
只是想添加一些点到OP自己find的解决scheme。
1)问题不在于AHK和VS使用不同的权限运行 – 只是运行在非pipe理模式下的脚本创build的热键不适用于在pipe理模式下运行的应用程序,但是如果它是反过来。
2)不需要编译脚本,只需要设置autohotkey.exe在pipe理模式下运行(这就是我所做的),或者创build一个特定脚本的快捷方式,并将其设置为始终以pipe理员模式运行。 (顺便说一句,要指出的是,运行AHK脚本的编译版本没有任何性能上的提高,因为代码仍然被解释 – 只是现在解释器被embedded到创build的可执行文件中)
小字中的这句话听起来有关:
如果SendMode用于自动执行部分(脚本的顶部),则会影响所有重新映射。 但是,由于重新映射使用Send {Blind}并且由于SendPlay模式并不完全支持{Blind},所以在SendPlay模式( 特别是Control,Shift,Alt和Win )下,某些重新映射可能无法正常运行。 要解决此问题,请在重新映射时避免自动执行部分中的SendPlay; 然后在脚本的其他地方使用SendPlay与Send命令。 或者,您可以将您的重新映射转换为显式调用SendEvent与发送的热键(如下所述)。