3

У меня есть некоторые действия, определенные в скрипте Autohotkey, и я хочу его запустить
всякий раз, когда я нажимаю ПРОБЕЛ+Alt+Q.

Как мне это сделать?

Я читал, что у пробела есть некоторые проблемы, потому что он уже используется AHK для подтверждения сокращений или чего-то подобного, но я действительно не использую сокращения.

~Space & j::
   If GetKeyState("Alt") = 0
           Send {Left}
   Else
           Send +{Left}
Return

Какие у вас есть предложения?

сейчас я пытаюсь получить то, что получено на форуме AHK, пока что это позволяет мне запускать сценарий непрерывно, не выпуская пробел

; THIS IS THE FIRST PART OF MY SCRIPT, ITS FOR THE e, +e, d, +d HOTKEYS...
ARprecColPickerFn(a, b, c)
{
clipboard =  ; Start off empty to allow ClipWait to detect when the text has arrived.
MouseGetPos posX, posY
BlockInput, MouseMove
MouseClick, Left, a, b
Sleep 50
SendInput {Ctrl Down}{c Down}
SendInput {c Up}{Ctrl Up}
ClipWait, 2  ; Waits 3 secs for the clipboard to contain text
clipboard += %c%
SendInput {Ctrl Down}{v Down}
SendInput {v Up}{Ctrl Up}
Send {Enter}
BlockInput, MouseMoveOff
MouseMove %posX%, %posY%
}

e::
ARprecColPickerFn(ARprecColPickerRestX, ARprecColPickerLumY, 2)
return

+e::
ARprecColPickerFn(ARprecColPickerRestX, ARprecColPickerLumY, 1)
return

d::
ARprecColPickerFn(ARprecColPickerRestX, ARprecColPickerLumY, -2)
return

+d::
ARprecColPickerFn(ARprecColPickerRestX, ARprecColPickerLumY, -1)
return


; THIS IS THE SECOND PART OF THE SCRIPT, IS FOR THE Space & e, Space & !e, Space & d, Space & !d...
~$Space::
    KeyWait,Space,T0.2
    If (ErrorLevel)
    {
        HotstringsEnabled:=true
        KeyWait,Space
        HotstringsEnabled:=false
    }
        else
        Send {Space}    
Return
#If HotstringsEnabled
#Hotstring *

e::
ARprecColPickerFn(ARprecColPickerRestX, ARprecColPickerBluY, 4)
return

!e::
ARprecColPickerFn(ARprecColPickerRestX, ARprecColPickerBluY, 2)
return

d:
ARprecColPickerFn(ARprecColPickerRestX, ARprecColPickerBluY, -4)
return

!d::
ARprecColPickerFn(ARprecColPickerRestX, ARprecColPickerBluY, -2)
#If

Пока что скрипт работает нормально, но у меня есть проблема. первая часть скрипта, та, которая использует "d" в качестве горячей клавиши, запускается всякий раз, когда я нажимаю «пробел + d», как я могу заставить оба действия сосуществовать вместе? (тот, который вызывается "d", а другой - "space & d". Пожалуйста, любой суперпользователь AHK, который мог это проверить, спасибо, дополнительно.

Кстати, что это значит ...

#Hotstring *

РЕДАКТИРОВАНИЕ >>>>

В сценарии Autohotkey я хотел бы, чтобы Space Alt E добавлял FIVE, Space Alt D - вычитание FIVE, Space E - добавление десяти, а Space D - вычитание десяти.

Я хочу добавить или вычесть последовательно и быстро, поэтому я хочу удерживать нажатой Space Alt и затем иметь различные события при нажатии E или D Например, SpaceHoldDown AltHoldDown Edown Eup Edown Eup Edown Eup ДОБАВЛЯЕТ ПЯТЬ 3 раза.

Также иногда я сначала нажимаю Space а затем Alt (чтобы удерживать их перед нажатием E или D для ДОБАВЛЕНИЯ или ВЫЧИСЛЕНИЯ), а иногда я нажимаю сначала Alt , а затем Space , но в любом случае я хотел бы получить тот же результат при нажатии E или D потом. Это то, что мой текущий скрипт не может сделать, то есть мне всегда нужно нажимать сначала Space а затем Alt прежде чем нажимать E или D чтобы скрипт работал, потому что, если я нажму сначала Alt а затем Space он не будет работать , Я бы хотел, чтобы скрипт работал независимо от того, в каком порядке нажаты Space и клавиша Alt .

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

В настоящее время скрипт работает, позволяя мне последовательно удерживать Space Alt и E или D , чтобы ДОБАВИТЬ или СУБРАКТИРОВАТЬ несколько раз, но у меня есть проблемы, которые я должен нажать сначала Space затем Alt иначе он не будет работать, также весь мир of script должен быть размещен в самом конце моего AHK-скрипта, иначе он будет мешать другим подпрограммам.

ПОСЛЕДНИЕ РЕДАКТИРОВАТЬ, КОД IM ПОПЫТКА НА ОСНОВЕ JJHONSTON2 ОТВЕТИТЬ ...

#If WinActive("ahk_class xxx") || WinActive("ahk_class YYY")

    #If (GetKeyState("Alt", "P")) && (GetKeyState("Space", "P"))
        q::
            msgbox you typed Alt Space Q
    #If
#If    <----- do I need to put a second #If (turn off context sensitivity)?

но это не работает

После тестирования я понял, что должен использовать #If а не If потому что последний только вызовет подпрограмму, если я нажму Alt и пробел ПОСЛЕ того, как я нажму Q.

Но использование #If не позволяет мне тестировать 2 ключа с помощью операнда &&. пожалуйста, кто-нибудь знает, как использовать #If GetKeyState с 2 клавишами Space и Alt

Пожалуйста , обратите внимание , что я должен быть в состоянии удерживать space и alt нажмите и отпустите Q несколько раз для того , чтобы добавить 10 последовательно, что очень важно, поэтому обходной путь , как это ниже не ПОЛЕЗНЫЕ Потому что это заставит меня отпустить alt или space между подпрограммами (запустить его несколько раз)

#If GetKeyState("Space", "P")
!q::    ;   The word UP may follow the name of a hotkey to cause the hotkey to fire upon release of the key rather than when the key is pressed down.
msgbox wttffff
Return
#If

#If GetKeyState("Alt", "P")
Space & q:: ;   The word UP may follow the name of a hotkey to cause the hotkey to fire upon release of the key rather than when the key is pressed down.
msgbox wttffff
Return
#If

спасибо заранее.

6 ответов6

3

Попробуй это

Space:: Send {Space}

Space & j::
If GetKeyState("Alt")
   Send +{Left}
else
   Send {Left}
Return

Space & e::
If (GetKeyState("Alt") & GetKeyState("Shift"))
    ARprecColPickerFn(ARprecColPickerRestX, ARprecColPickerLumY, 1)
else
If GetKeyState("Alt")
    ARprecColPickerFn(ARprecColPickerRestX, ARprecColPickerBluY, 2)
else
    ARprecColPickerFn(ARprecColPickerRestX, ARprecColPickerBluY, 4)
return

Space & d::
If (GetKeyState("Alt") & GetKeyState("Shift"))
    ARprecColPickerFn(ARprecColPickerRestX, ARprecColPickerLumY, -1)
else
If GetKeyState("Alt")
    ARprecColPickerFn(ARprecColPickerRestX, ARprecColPickerLumY, -2)
else
    ARprecColPickerFn(ARprecColPickerRestX, ARprecColPickerBluY, -4)
return

    ARprecColPickerFn(a, b, c){
clipboard =  ; Start off empty to allow ClipWait to detect when the text has arrived.
MouseGetPos posX, posY
BlockInput, MouseMove
MouseClick, Left, a, b
Sleep 50
SendInput {Ctrl Down}{c Down}
SendInput {c Up}{Ctrl Up}
ClipWait, 2  ; Waits 3 secs for the clipboard to contain text
clipboard += %c%
SendInput {Ctrl Down}{v Down}
SendInput {v Up}{Ctrl Up}
Send {Enter}
BlockInput, MouseMoveOff
MouseMove %posX%, %posY%
}
1

Я просто перевернул скрипт вверх дном, и таким образом он позволяет запускать его несколько раз, не нажимая ни одну клавишу, даже если вы можете удерживать клавишу Space & e , даже не задумываясь о том, чтобы запустить его несколько раз.

; THIS WAS THE SECOND PART OF THE SCRIPT, IS FOR THE Space & e, Space & !e, Space & d, Space & !d...
~$Space::
    KeyWait,Space,T0.2
    If (ErrorLevel)
    {
        HotstringsEnabled:=true
        KeyWait,Space
        HotstringsEnabled:=false
    }
        else
        Send {Space}    
Return
#If HotstringsEnabled
#Hotstring *

e::
ARprecColPickerFn(ARprecColPickerRestX, ARprecColPickerBluY, 4)
return

!e::
ARprecColPickerFn(ARprecColPickerRestX, ARprecColPickerBluY, 2)
return

d:
ARprecColPickerFn(ARprecColPickerRestX, ARprecColPickerBluY, -4)
return

!d::
ARprecColPickerFn(ARprecColPickerRestX, ARprecColPickerBluY, -2)
#If



; THIS WAS THE FIRST PART OF MY SCRIPT, ITS FOR THE e, +e, d, +d HOTKEYS...
ARprecColPickerFn(a, b, c)
{
clipboard =  ; Start off empty to allow ClipWait to detect when the text has arrived.
MouseGetPos posX, posY
BlockInput, MouseMove
MouseClick, Left, a, b
Sleep 50
SendInput {Ctrl Down}{c Down}
SendInput {c Up}{Ctrl Up}
ClipWait, 2  ; Waits 3 secs for the clipboard to contain text
clipboard += %c%
SendInput {Ctrl Down}{v Down}
SendInput {v Up}{Ctrl Up}
Send {Enter}
BlockInput, MouseMoveOff
MouseMove %posX%, %posY%
}

e::
ARprecColPickerFn(ARprecColPickerRestX, ARprecColPickerLumY, 2)
return

+e::
ARprecColPickerFn(ARprecColPickerRestX, ARprecColPickerLumY, 1)
return

d::
ARprecColPickerFn(ARprecColPickerRestX, ARprecColPickerLumY, -2)
return

+d::
ARprecColPickerFn(ARprecColPickerRestX, ARprecColPickerLumY, -1)
return
1

Я пишу дальше, потому что вы продолжаете пробовать разные предложения и комбинации, а не просто просите кого-то еще написать ваш сценарий.

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

Пример: запуск только при нажатии пробела.

#If GetKeyState("Space", "P")   ; All hotkeys below won't trigger unless space is pressed
q::
    ToolTip % "Space+q pressed..."
    Sleep 500
    ToolTip
Return

!q::
    ToolTip % "Space+Alt+q pressed..."
    Sleep 500
    ToolTip
Return
#If

Пример: неопределенные триггеры для нескольких проверок модификаторов в коде горячей клавиши.

#If WinActive("ahk_class xxx") || WinActive("ahk_class YYY")
*q::        ; * Triggers for all/multiple modifiers.  q keypress is discarded.

    If !(GetKeyState("Alt", "P") && GetKeyState("Space", "P"))
        Return  ; continue no further unless Alt+Space are also pressed.  q keypress is discarded

    ; This code below will execute for Alt+Space-q and also Alt+Space+Control+q (i.e., * modifiers that haven't been excluded via test above)
    ToolTip % A_ThisHotkey " pressed..."
    Sleep 500
    ToolTip
Return

Пример: ручная отправка нажатия клавиш (т. Е. Фильтрация модификаторов в горячих клавишах)

#If WinActive("ahk_class xxx") || WinActive("ahk_class YYY")
*q::        ; * Triggers for all/multiple modifiers

    If !(GetKeyState("Alt", "P") && GetKeyState("Space", "P")) {
        SendInput {Blind}q      ; send q keystroke and allow any pressed modifiers to stay in tact.  If Control is down, Control+q will get sent
        Return  ; continue no further unless Alt+Space are also pressed.  
    }

    ; This code below will execute for Alt+Space-q and also Alt+Space+Control+q (i.e., * modifiers that haven't been excluded via test above)
    ToolTip % A_ThisHotkey " pressed..."
    Sleep 500
    ToolTip
Return

Пример: нажатие клавиши отправляется в программу независимо от того, действуете вы на ней или нет.

#If WinActive("ahk_class xxx") || WinActive("ahk_class YYY")
~*q::       ; * Triggers for all/multiple modifiers; ~ allow passthrough so keystroke is not discarded

    If !(GetKeyState("Alt", "P") && GetKeyState("Space", "P"))
        Return  ; continue no further unless Alt+Space are also pressed.  q keypress has already passed through to program

    ; This code below will execute for Alt+Space-q and also Alt+Space+Control+q (i.e., * modifiers that haven't been excluded via test above)
    ToolTip % A_ThisHotkey " pressed..."
    Sleep 500
    ToolTip
Return

Пример: несколько определений / действий в одной горячей клавише (работает, но не рекомендуется реализация).

#If WinActive("ahk_class xxx") || WinActive("ahk_class YYY")
*q::        ; * Triggers for all/multiple modifiers; ~ allow passthrough so keystroke is not discarded

    If !GetKeyState("Space", "P")
        Return  ; continue no further unless Alt+Space are also pressed.  q keypress is discarded

    If (GetKeyState("Alt", "P") {
        ToolTip % "Alt+Space+q (and possibly other modifiers) pressed..."
        Sleep 500
        ToolTip
    } Else {
        ToolTip % "Space+q (and possibly other modifiers) pressed..."
        Sleep 500
        ToolTip
    }
Return

Вы можете различать, какие клавиши находятся внутри определения горячей клавиши, и выборочно выполнять код отдельных наборов, но, как правило, рекомендуется использовать операторы #If чтобы определить, когда выполняется код горячей клавиши.

Не используйте два #If's в строке ... определение горячей клавиши определяется последним последовательным оператором #If перед оператором определения горячей клавиши ...

; Do Not Use...
#If WinActive("ahk_class xxx") || WinActive("ahk_class YYY")
#If (GetKeyState("Alt", "P")) && (GetKeyState("Space", "P"))    ; this voids the #If statement above

Должно быть следующим ниже.

; If ahk_class xxx or yyy, and if Alt+Space is also pressed...
#If (WinActive("ahk_class xxx") || WinActive("ahk_class YYY"))  && (GetKeyState("Alt", "P") && GetKeyState("Space", "P"))   
; ...
; code goes here
; ...
#IfWinActive ; this sets context for the next hotkeys back to default; only one statement needed; indentation is irrelevant

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

Этот оператор также может автоматически продолжаться в двух строках (для стиля / читабельности), поскольку логические операторы распознаются как продолжающие последнюю строку ...

#If (WinActive("ahk_class xxx") || WinActive("ahk_class YYY"))  
&& (GetKeyState("Alt", "P") && GetKeyState("Space", "P"))
;q::    ; q hotkey without modifiers will never trigger here because Alt must be down to get this far
!q::    ; this will trigger
    ToolTip % "Space+Alt+q pressed..."
    Sleep 500
    ToolTip
Return
!d::
    ToolTip % "Space+Alt+d pressed..."
    Sleep 500
    ToolTip
Return
#If

Пример: разделенная обработка (определение горячих клавиш внутри / снаружи) (работает, но не рекомендуется)

#If (WinActive("ahk_class xxx") || WinActive("ahk_class YYY"))
!q::
    If GetKeyState("Space", "P") {
        ToolTip % "Space+Alt+q pressed..."
        Sleep 500
        ToolTip
    } Else {
        ToolTip % "Alt+q pressed..."
        Sleep 500
        ToolTip
    }
Return
#If

Пример: вся обработка внутри определения горячей клавиши (работает, но не рекомендуется реализация)

!q::
    If !(WinActive("ahk_class xxx") || WinActive("ahk_class YYY"))
        Return

    If GetKeyState("Space", "P") {
        ToolTip % "Space+Alt+q pressed..."
        Sleep 500
        ToolTip
    } Else {
        ToolTip % "Alt+q pressed..."
        Sleep 500
        ToolTip
    }
Return
#If

Последний пример с разделением кода между горячими клавишами по мере необходимости и понижением выбора операторов #If , чтобы всегда было активным определенное окно класса и нажатой пробел ...

#Persistent
Return


#If (WinActive("ahk_class xxx") || WinActive("ahk_class YYY")) 
 && GetKeyState("Space", "P")   ; All hotkeys below won't trigger unless space is pressed

;!Space::Return     ; Optional. Kill the window system menu if present

q::
    ToolTip % "Space+q pressed..."
    Sleep 500
    ToolTip
Return

!q::
    ToolTip % "Space+Alt+q pressed..."
    Sleep 500
    ToolTip
Return

d::
    ToolTip % "Space+d pressed..."
    Sleep 500
    ToolTip
Return

!d::
    ToolTip % "Space+Alt+d pressed..."
    Sleep 500
    ToolTip
Return
#If

Обратите внимание, что это не отменяет использование Space или Alt+Space качестве отдельных нажатий клавиш. Например, если вы нажмете Space а затем Alt а затем горячую клавишу, он отправит Space до того, как выполнит код Alt+hotkey . Точно так же, если вы нажмете Alt+Space (скажем, в обычном окне), оно вызовет системное окно в левом верхнем углу (Восстановить / Переместить / Размер / Свернуть / Развернуть / Закрыть / Закрыть). Функциональность горячих клавиш все равно будет работать, но выпадающее меню может раздражать (если вы не находитесь в окне инструментов, которое уже исключает это меню), в этом случае вы также можете добавить !Space::Return чтобы убить функциональность Alt+Space при сохранении горячей клавиши. В этом случае он должен быть добавлен в блок контекста (соответствующий оператор #If ), поэтому он применяется только к этому конкретному окну.

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

1

Я думаю, что вы можете запустить горячую клавишу только с ключами активации !{alt}, +{shift}, ^{ctrl}, win{#} . Вы можете попробовать что-то в этом роде:

#if getKeyState("space")
!q:: run notepad.exe
#if

Это запустит notepad.exe но сначала запустит кнопку space .

0

В ответ на обновленный пост ...

Если вы хотите, чтобы верхняя горячая клавиша была обусловлена отсутствием клавиши пробела, горячая клавиша не сработает, если пробел удерживается. Это также должно быть «отменено» по мере того, как сценарий прогрессирует ниже, поэтому также должен быть оператор #IfWinActive, чтобы это условие не применялось к дальнейшим определениям горячей клавиши ниже.

Верхняя часть скрипта будет выглядеть так ...

#If !GetKeyState("Space", "P")
+d::
ARprecColPickerFn(ARprecColPickerRestX, ARprecColPickerLumY, -1)
return

#IfWinActive
; THIS IS THE SECOND PART OF THE SCRIPT, IS FOR THE Space & e, Space & !e, Space & d, Space & !d...
~$Space::

Для другого вопроса ...

#Hotstring *

... это помещает опцию * в действие для всех горячих строк, определенных после этой строки в коде.

Из #Hostring Help Topic:

*(звездочка): конечный символ (например, пробел, точка или ввод) не требуется для запуска горячей строки. Например:

:*:j@::jsmith@somedomain.com

Возвращаясь к общей архитектуре вашей работы, я бы просто использовал #If на всех ваших горячих клавишах, как заметил IGRACH, и покончил со сложным циклом обнаружения пространства, который включает / отключает горячие клавиши.

0
  • Этот скрипт AutoHotkey должен делать то, что вам нужно.
  • Проверено на Windows 7.
  • В AutoHotkey из-за того, как изготавливаются клавиатуры, различные комбинации клавиш создают трудности, в данном случае: горячая клавиша с двумя немодифицированными клавишами (пробел и буквы) и клавиша Alt . Другие проблемные ключи включают в себя CapsLock, Fn и комбинацию Win+L.
  • Этот сценарий позволяет получить неуклюжую комбинацию клавиш, чтобы функционировать довольно гладко.
  • Этот скрипт работает, когда Блокнот является активным окном. Используйте Ctrl+Q, чтобы удалить строки меню / системного меню, которые мешают Alt и Alt+Space, и используйте Ctrl+W, чтобы восстановить строки меню.

-

;space alt e: +5
;space alt d: -5
;space e: +10
;space d: -10

;ctrl+q: prepare Notepad window (remove menu + sysmenu bars which interfere with alt)
;ctrl+w: restore Notepad window
;ctrl+e: set number to 0
;alt: blocked
;space: blocked
;ctrl+space: send space

vNum := 0

#IfWinActive,ahk_class Notepad

^e::
vNum := 0
Return

^q::
WinGet, hWnd, ID, A
WinGetClass, vWinClass, ahk_id %hWnd%
if vWinClass in Notepad
{
if (hMenu%hWnd% = "")
hMenu%hWnd% := DllCall("GetMenu", "uint", hWnd)
DllCall("SetMenu", "uint", hWnd, "uint", 0) ;hide menu bar
WinSet, Style, -0x80000, ahk_id %hWnd% ;WS_SYSMENU := 0x80000 ;hide system menu
}
Return

^w::
WinGet, hWnd, ID, A
WinGetClass, vWinClass, ahk_id %hWnd%
if vWinClass in Notepad
{
if !(hMenu%hWnd% = "")
DllCall("SetMenu", "uint", hWnd, "uint", hMenu%hWnd%) ;restore menu bar
WinSet, Style, +0x80000, ahk_id %hWnd% ;WS_SYSMENU := 0x80000 ;restore system menu
}
Return

Space & e::
if GetKeyState("Alt", "p")
vNum += 5
else
vNum += 10
ToolTip %vNum%
Return

Space & d::
if GetKeyState("Alt", "p")
vNum -= 5
else
vNum -= 10
ToolTip %vNum%
Return

Alt::
Return

Space::
Return

^Space::
SendInput {Space}
Return

#IfWinActive

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .