Autohotkey, как определить, когда ключ используется в качестве префикса

1

У меня есть краткий вопрос со сценарием ниже:

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_up только когда нажимаю и отпускаю F1один. НО, когда я нажимаю F1 , нажимаю F9, отпускаю F9, отпускаю F1 , я не вижу F1_up . Как это увидеть?

Autohotkey 1.1.13.1

Джимм Чен
источник

Ответы:

0

Я тоже не понимаю этого поведения. Очевидно, что 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, поэтому при 4-х тактном нажатии (F1 вниз, F9 вниз, F9 вверх, F1 вверх) будет срабатывать F9 Up, а не F1 Up.

Одним из возможных решений было бы создание собственной процедуры для определения состояния ключей и последующего независимого вызова вашего кода. Возможно, это связано с первой проблемой, но GetKeyState, похоже, не работает, если вы добавляете фактический F1::вызов или F1 & F9::вызов, поэтому попробуйте протестировать этот автономный вариант, чтобы убедиться, что он работает, прежде чем интегрировать его с чем-либо еще.

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
JJohnston2
источник