【问题标题】:How come AutoHotkey is able to use 'RCtrl' as hotkey while AutoIt can't?为什么 AutoHotkey 能够使用“RCtrl”作为热键而 AutoIt 不能?
【发布时间】:2014-05-05 16:21:29
【问题描述】:

CtrlAltWinShift 通常称为modifier keys。通常它们与其他键组合,例如 A=F5 等。 遵循此键绑定 limitation 没有。

为什么 AutoHotkey 可以使用 RCtrl 作为 individual 热键,而 AutoIt 不能?我想知道 AutoHotkey 用什么技巧来实现这一点。 AutoHotkey 是从 AutoIt v2 衍生而来的,所以 AutoIt v3 不能做到这一点是不是很奇怪?

这在 AutoHotkey:RAlt::Run Notepad 中有效,但以下代码不适用于 AutoIt v3(使用 Au3Check 检查):

HotKeySet("{RAlt}","RunNotepad")
Func RunNotepad()
   Run('notepad.exe')
EndFunc

【问题讨论】:

  • 我必须明确指出,我并不是说单独使用修饰键作为热键是必要的功能或定义热键的好方法。我只是对 AHK basic 和 AutoIt 之间的低级实现差异感到好奇。

标签: autoit autohotkey autohotkey autoit keyboard-events


【解决方案1】:

首先,您的 AutoIt 代码将运行,然后立即退出。您需要在其中添加一个循环以保持程序运行。

我不能代表 AHK 的实现,但是通过使用 AutoIt 几乎可以肯定使用的 windows api (RegisterHotkey) 进行测试,我不能只获得 VK_RMENU 键。所以这是 Windows 的限制,而不是 AutoIt 的限制。

至于替代实现,以及如何从 AutoIt 执行此操作,_IsPressed 是最简单的选择。通常你会在一个循环中使用_IsPressed,但如果你希望它的行为更像HotkeySet,那么你可以这样做:

#include <Misc.au3>

AdlibRegister(_TestRalt, 20)

While 1
    Sleep(10)
WEnd


Func _RunNotepad()
    ConsoleWrite("Just pretend I ran notepad" & @LF)
EndFunc   ;==>_RunNotepad

Func _TestRalt()
    Local Static $hUser32 = DllOpen("user32.dll")
    Local Static $fPressed = False

    If _IsPressed("A5", $hUser32) Then
        $fPressed = True
    ElseIf $fPressed Then
        _RunNotepad()
        $fPressed = False
    EndIf
EndFunc   ;==>_TestRalt

我怀疑如果 AHK 可以开箱即用地做到这一点,那么他们正在做一些更复杂的事情,比如键盘挂钩。

【讨论】:

    猜你喜欢
    • 2020-03-18
    • 2012-01-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-06-15
    • 2013-11-18
    相关资源
    最近更新 更多