Autohotkey,当该键用作前缀时如何检测键释放

Autohotkey,当该键用作前缀时如何检测键释放

我对以下脚本有一个简洁的问题:

global Eme_Fn_idle := true

F1 UP:: 
    MsgBox, F1_up ; ★I wish to see this after pressing and releaseing F1+F9
    Eme_Fn_idle = true
return

F1 & F9::
    if (Eme_Fn_idle) {
        Eme_Fn_idle = false
        Eme_ClickOnDocTab(0, 0, 18)
    }
    else {
        Send ^!. ; switch to Right Document
    }
return

我只能看到F1_向上当我单独按下并释放时F1。但是,当我按 F1,按 F9,松开 F9,松开 F1, 我看不见F1_向上. 无论如何该如何看待它?

Autohotkey 1.1.13.1

答案1

我也不明白这种行为。显然,F1 UP 被程序阻止了,如密钥历史记录中所示(下面倒数第二行有一个 s,表示它被抑制或阻止):

h=Hook Hotkey, s=Suppressed (blocked)

70  03B s   d   0.89    F1              temp.ahk
70  03B h   u   0.17    F1              
0D  01C     d   0.31    Enter           temp.ahk
0D  01C     u   0.17    Enter           temp.ahk
70  03B s   d   1.36    F1              
78  043 h   d   0.17    F9              
78  043 s   u   0.16    F9              
70  03B s   u   0.45    F1              
26  148     d   0.95    Up 

您可以添加一个F1 & F9 UP::但是,它将捕获 F1 或 F9 被释放的 OR 条件,因此在 4 次按下(F1 向下、F9 向下、F9 向上、F1 向上)时,它将在 F9 向上上触发,而不是 F1 向上。

一种可能的解决方案是制作自己的例程来检测按键状态,然后独立调用代码。可能与第一个问题有关,但如果您添加实际F1::调用或F1 & F9::调用,GetKeyState 似乎不起作用,因此在将其与其他任何东西集成之前,请尝试测试此独立程序以查看它是否正常工作。

waitingForF1Up := false
CheckF1Up:
    Loop
    {
        F1 := GetKeyState("F1", "P")
        F9 := GetKeyState("F9", "P")

        tooltip % F1 ", " F9

        if F1 and F9 and not waitingForF1Up
        {
            SetTimer, F1andF9, -1
            waitingForF1up := True
        }
        else if not F1 and waitingForF1up
        {
            SetTimer, F1up, -1
            waitingForF1up := False
        }

        sleep 10

    }

return

F1up:
    tooltip F1 up executed
    sleep 1000
    tooltip
return

F1andF9:
    tooltip F1 and F9 executed
    sleep 1000
    tooltip
return

相关内容