Почему при запуске этого сценария подавляются события пробела? - PullRequest
3 голосов
/ 02 июля 2019

Я сделал скрипт для мозаичного размещения окон левой рукой в ​​windows 10, используя раскладку клавиатуры дворака.Он работает, как и ожидалось, за исключением того, что он предотвращает попадание событий пробела в любую программу, кроме самого скрипта.Это журнал клавиатуры при запуске скрипта:

20  039 s   d   0.09    Space           
20  039 s   u   0.08    Space           
20  039 s   d   0.08    Space           
20  039 s   u   0.08    Space           
20  039 s   d   0.08    Space           
20  039 s   u   0.09    Space           
20  039 s   d   0.08    Space           
20  039 s   u   0.09    Space           
20  039 s   d   31.14   Space           
20  039 s   u   0.11    Space           
20  039 s   d   0.09    Space           
20  039 s   u   0.11    Space

Оба пробела обнаружены правильно, но остаются подавленными.Завершение сценария вручную решает проблему.

  #MaxThreads 255 ; for the purpose of troubleshooting

    #e::return      
    #.::return 
    #o::return          
    #u::return       

    Space & u::  
    Space & .::
    Space & o::
    Space & e::
    send {LWin Down}
    spcup()       
    exit

    spcup()                                                                          
    {
    while GetKeyState("Space", "P") {
    rite := GetKeyState("u", "P")
    left := GetKeyState("o", "P")
    up := GetKeyState(".", "P") 
    down := GetKeyState("e", "P")           
    if (rite=1) {
        Sleep 75
        Send {Right}
        Sleep 75
        }
        else if (left=1) {
            Sleep 75
            Send {Left}
            Sleep 75 
            }   
        else if (up=1) {
            Sleep 75
            Send {Up}
            Sleep 75  
            }
        else if (down=1) {
            Sleep 75
            Send {Down}
            Sleep 75
            }
        else if !GetKeyState("Space", "P") { 
            sleep 75
            Send {LWinUp}
            exit
            }
    }
    }

PS, я использовал пробел, потому что мой левый ключ Windows физически поврежден.Привязка пространства к себе, добавление строки «Space :: Space», работает частично, только событие up зарегистрировано как горячая клавиша, поэтому оно срабатывает только при отпускании пробела, выдающего это:

20  039 s   d   0.25    Space           
20  039 h   u   0.16    Space           
20  039 i   d   0.00    Space           
20  039 i   u   0.00    Space   

s=suppressed
h=hotkey
i=ignored(sent by autohotkey itself)

«Решено», вид.У префиксного ключа нет способа сохранить исходную функцию без ~, следовательно, отправка его в активное окно, что нежелательно.

isWindowFullScreen()
{
    ;checks if the specified window is full screen
    ;use WinExist of another means to get the Unique ID (HWND) of the desired window

    if  WinExist("A") {
    WinGet, style, Style, A
    WinGetPos ,,,winW,winH, A
    ; 0x800000 is WS_BORDER.
    ; 0x20000000 is WS_MINIMIZE.
    ; no border and not minimized
    retVal := ((style & 0x20800000) or winH < A_ScreenHeight or winW < A_ScreenWidth) ? 0 : 1
    Return, retVal
}
else {
return
}
}

#if isWindowFullScreen() = 0
#e::return       
#.::return 
#o::return          
#u::return
#Space::return 
Space::Space             
Space & u::                                                        
Space & .::
Space & o::
Space & e::
send {LWin Down}
spcup()       
exit



spcup()                                                                                   
{
while GetKeyState("Space", "P") {
loop {
rite := GetKeyState("u", "P")
left := GetKeyState("o", "P")
up := GetKeyState(".", "P") 
down := GetKeyState("e", "P")           
if (left=1) {
    Sleep 75
    Send {Left}
    Sleep 75 
    }   
    else if (up=1) {
        Sleep 75
        Send {Up}
        Sleep 75  
        }
    else if (down=1) {
        Sleep 75
        Send {Down}
        Sleep 75
        }
    else if (rite=1) {
        Sleep 75
        Send {Right}
        Sleep 75
        }
} until !GetKeyState("Space", "P") 
Sleep 75
Send {LWinUp}
exit
}
}

1 Ответ

1 голос
/ 03 июля 2019

Из справочной документации :

Numpad0 & Numpad1::MsgBox You pressed Numpad1 while holding down Numpad0.
Numpad0 & Numpad2::Run Notepad

Префиксный ключ теряет свою собственную функцию: В приведенном выше примере Numpad0 становится префиксный ключ ;но это также приводит к тому, что Numpad0 теряет свою первоначальную / нативную функцию, когда он нажимается сам по себе.Чтобы избежать этого, сценарий может настроить Numpad0 для выполнения нового действия, такого как одно из следующих действий:

Numpad0::WinMaximize A   ; Maximize the active/foreground window.
Numpad0::Send {Numpad0}  ; Make the release of Numpad0 produce a
Numpad0 keystroke. See comment below.

Пожар при выпуске: Наличие одной из вышеуказанных комбинаций клавишзаставляет релиз Numpad0 выполнить указанное действие, но только если вы не нажимали никакие другие клавиши, пока Numpad0 удерживался нажатым.[v1.1.14 +]: Этого можно избежать, применив префикс тильды к любой из горячих клавиш.

Добавление префикса тильды ~ к каждой из ваших горячих клавиш Space & должно заставить его вести себя каквы ожидаете.В качестве альтернативы, вы можете добавить ~Space::Return.

Обратите внимание, что это всегда будет отправлять пробел, который может иметь непредвиденные последствия в разных приложениях.Например, в браузере он будет прокручиваться вниз, аналогично нажатию клавиши вниз страницы.

Вот сокращенная версия вашего кода, который я использовал для тестирования:

~Space & u::
~Space & .::
~Space & o::
~Space & e::
aReplace := [[ "u" , "Right" ] , [ "o" , "Left" ] , [ "." , "Up" ] , [ "e" , "Down" ]]
Loop , % aReplace.Length()
    sReplace := ( SubStr( A_ThisHotkey , 0 , 1 ) = aReplace[ A_Index , 1 ] ) ? aReplace[ A_Index , 2 ] : sReplace
Send , #{%sReplace%}
Return
...