为什么Visual Studio在自动热键之前捕获关键事件?


82

作为一项实验,我最近切换到了Dvorak键盘布局。过渡中最困难的部分之一是处理热键。大多数热键在设计时都考虑了QWERTY,更糟糕的是,热键似乎束缚了肌肉。

而不是重新学习所有的热键,我写了一个脚本的AutoHotkey翻译当Dvorak布局回QWERTY CtrlAltWin与其他键一起按下的键。除了Visual Studio '08,它在我尝试过的所有地方都能正常工作。似乎在自动热键可以翻译键击之前就已将其捕获。

为什么会发生这种情况,我该如何解决?

以下是我的脚本的摘录:

; control + letter
^;::^z
^q::^x
^j::^c
^k::^v

更新:该脚本在带有ahk,vs08和最新安装的Coderush的Win7上可以正常工作。我遇到问题的机器正在运行Vista。关于如何进一步诊断有什么想法?

更新2:该脚本可以在Vista和2010 beta 2上正常工作。似乎只有vs 08 + vista。今晚将尝试全新安装vs08。

Answers:


174

啊哈!我知道了。如果ahk和目标应用程序不在同一特权(或用户)下运行,则ahk将无法正确拦截/模拟键盘事件。就我而言,Visual Studio是使用管理员(提升的)特权运行的,而ahk脚本是以当前登录的用户身份运行的。

以下任一方法均可解决问题:

  • 以当前用户身份运行vs和ahk
  • 编译脚本并以管理员身份运行vs和已编译的应用程序

15
只是想补充一点,它与不同的权限无关。但是相反,AutoHotkey脚本不适用于以比该脚本更高的特权级别运行的应用程序。请参阅下面的答案。
Himanshu P 2012年

2
您可以将“以管理员身份运行”添加到ahk的上下文菜单中。它节省了编译步骤。 howtogeek.com/howto/windows-vista/…–
亚当·贝尔

我在这里找到了一种更干净的方法,可以通过Task Scheduler在每次启动时以管理员身份运行AutoHotkey脚本,而无需用户干预:autohotkey.com/boards/viewtopic.php?t=21434
Jose Antonio

为此加油助威
illusion466

48

只是想在OP自己找到的解决方案中添加几点。

1)问题不是AHK和VS以不同的权限运行-只是由以非管理员模式运行的脚本创建的热键无法在以管理员模式运行的应用程序上运行,但是如果反之亦然。

2)不必一定要编译脚本,只需将autohotkey.exe设置为在admin模式下运行(这就是我要做的事),或者为特定脚本创建快捷方式并将其设置为始终在admin模式下运行。(顺便说一句,只是指出,运行AHK脚本的编译版本不会提高性能,因为仍然可以解释代码-只是现在解释器已嵌入创建的可执行文件中)


2

这是由于称为用户界面特权隔离(UIPI)的安全功能所致,该功能是用户帐户控制(UAC)的一部分。

常见问题解答中列出了几种解决方法:

如何解决由用户帐户控制(UAC)引起的问题?

常见的解决方法如下:

  • 在“自动热键设置”中启用“将具有UI访问权限的运行添加到上下文菜单”选项。通过从“开始”菜单重新运行AutoHotkey设置,可以启用或禁用此选项而无需重新安装AutoHotkey。启用后,通过右键单击脚本文件并选择“使用UI Access运行”来启动脚本文件,或使用类似的命令行"AutoHotkeyU32_UIA.exe" "Your script.ahk"(但包括完整路径)。
  • 以管理员身份运行脚本。请注意,这还会导致脚本启动的所有程序都以管理员身份运行,并且可能要求用户在启动脚本时接受批准提示。
  • 禁用本地安全策略“以管理员批准模式运行所有管理员”(不建议)。
  • 完全禁用UAC。不建议这样做,并且在Windows 8或更高版本上不可行。

我通常不建议以管理员身份运行脚本来解决此问题,因为它具有可能是意料之外或不希望有的副作用。例如,脚本启动时使用的任何程序Run也将以管理员身份运行。该脚本还将对各种文件夹(例如程序文件)具有不必要的写许可。少量不良代码(从某处复制粘贴的恶意代码,或带有错误的代码)可能会对这种方式造成更大的破坏。

当然,我也不建议使用最后两个选项。剩下的仅是使用UI Access运行,可以如上所述启用和使用。


0

显然,有一种解决方法。

从docs Program.htm#Installer_uiAccess中获取
Lexikos的论坛主题

摘抄:

启用UIAccess

修改AutoHotkey.exe,即使启用了UAC,也允许脚本执行以下操作:

与管理程序的窗口进行交互,而无需以管理员身份运行脚本。使用SendPlay。有局限性;请在使用此脚本之前阅读该帖子。

论坛上ahk文件的下载链接已损坏,但我在Github上找到了它:EnableUIAccess.ahk


为什么要查看EnableUIAccess.ahk?它已经过时了。您链接到的文档向您介绍了AutoHotkey安装程序中内置的选项。安装程序包含您需要的一切。(我也发布了更多详细信息作为答案。)
Lexikos
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.