代码之家  ›  专栏  ›  技术社区  ›  keparo

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

  •  72
  • keparo  · 技术社区  · 16 年前

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

    我没有重新学习所有热键,而是编写了一个自动热键脚本来将dvorak布局转换回qwerty,当 Ctrl键 ,请 中高音 按键与其他按键一起按下。它在我尝试过的任何地方都能很好地工作,除了2008年的Visual Studio。似乎在自动热键可以翻译它们之前就已经捕获了击键。

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

    以下是我的脚本的摘录(从开始):

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

    更新: 该脚本在Win7上运行良好,新安装了ahk、vs08和coderush。我遇到麻烦的机器正在运行Vista。对如何进一步诊断有什么想法吗?

    更新2: 该脚本在Vista和2010测试版2上运行良好。似乎是一个只有vs 08+vista的东西。今晚尝试新安装的VS08。

    5 回复  |  直到 7 年前
        1
  •  151
  •   keparo    16 年前

    啊哈!我已经弄明白了。如果ahk和目标应用程序没有以相同的权限(或用户)运行,则ahk将无法正确拦截/模拟键盘事件。在我的例子中,Visual Studio是以管理员(提升的)权限运行的,而ahk脚本是以当前登录用户的身份运行的。

    以下任一项解决了问题:

    • 以当前用户身份运行vs和ahk
    • 编译脚本并以管理员身份运行VS和编译后的应用程序
        2
  •  41
  •   Himanshu P    10 年前

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

    1)问题不在AHK和VS运行时 不同的 权限-它只是由运行在 非管理员 模式无法在运行在 管理员 模式,但如果是相反的模式就没问题了。

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

        3
  •  1
  •   Lexikos    7 年前

    这是由于一个名为 User Interface Privilege Isolation (UIPI) ,它是用户帐户控制(UAC)的一部分。

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

    How do I work around problems caused by User Account Control (UAC)?

    常见的解决方法如下:

    • 启用 Add 'Run with UI Access' to context menus 自动热键设置中的选项。通过从“开始”菜单重新运行自动热键安装程序,可以启用或禁用此选项,而无需重新安装自动热键。启用后,右键单击脚本文件并选择 使用用户界面访问运行 或者使用类似的命令行 "AutoHotkeyU32_UIA.exe" "Your script.ahk" (但包括完整路径)。
    • 以管理员身份运行脚本。注意,这也会导致脚本启动的任何程序以管理员身份运行,并且可能要求用户在启动脚本时接受审批提示。
    • 禁用本地安全策略“以管理员审批模式运行所有管理员”(不推荐)。
    • 完全禁用UAC。不建议这样做,在Windows 8或更高版本上也不可行。

    我一般不建议以管理员的身份运行脚本来解决这个问题,因为它有可能是意外的或不需要的副作用。例如,脚本启动时使用的任何程序 Run 也将以管理员身份运行。脚本对各种文件夹(如程序文件)也具有不必要的写入权限。一些错误的代码(恶意代码复制粘贴在某个地方,或者带有错误的代码)会以这种方式造成更多的损害。

    当然,我也不推荐最后两个选项。只剩下 使用用户界面访问运行 ,可以按上述方式启用和使用。

        4
  •  0
  •   Hans Passant    16 年前

    这个短语在 small print 声音相关:

    如果在自动执行部分(脚本顶部)中使用sendmode,则会影响所有重新映射。但是,由于重新映射使用send blind,并且sendplay模式不完全支持blind,因此某些重新映射可能无法在sendplay模式下正常工作。( 尤其是控球、移球、ALT和胜利 )要解决此问题,请在重新映射时避免“自动执行”部分中的sendplay;然后在整个脚本的其他位置使用命令sendplay和send。或者,您可以将重新映射转换为热键(如下所述),该热键显式调用sendEvent和send。

        5
  •  0
  •   Laoujin    8 年前

    显然,有一个解决办法。

    从文档 Program.htm#Installer_uiAccess .
    Forum thread by Lexikos

    Excerpt:

    启用uiaccess

    修改autohotkey.exe以允许脚本在启用UAC时执行以下操作:

    在不以管理员身份运行脚本的情况下与管理程序的Windows交互。 使用提示播放。 有一些限制;请在使用此脚本之前阅读文章。

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