1

Я использую AHK 1.1, чтобы установить CapsLock как горячую клавишу для переключения полноэкранного режима ArtRage (режим рабочей среды), я делаю это потому, что ArtRage не позволяет мне устанавливать CapsLock как горячую клавишу, но я довольно привык использовать эту клавишу чтобы сделать это во многих программах, поэтому я подумал, что AHK может мне помочь, мой сценарий был прост:

;   AR4 Toggle Workbench Mode
Capslock::
Send {Ctrl Down}{Right}{Ctrl Up}    ; Ctrl Right is the key I set to toogle the workbench mode
WinActivate ahk_class ArtRage 3
return
#If

Сценарий работает только при первом включении full screen mode и при первом его отключении, я имею в виду первые два раза, когда я нажимаю CapsLock , но затем он не будет работать, если я не нажму вручную в окне ArtRage. Если я сделаю это, я могу использовать горячую клавишу еще два раза. Так что, думаю, я как-то теряю фокус на окне. Я пробовал также это:

Capslock::
ControlSend,, {Ctrl Down}{Right}{Ctrl Up}, ahk_class ArtRage 3
WinActivate ahk_class ArtRage 3
return
#If

с тем же результатом, я гугл об этом, и я попытался:

Capslock::
WinGet, AR4_id, ID, A
Send {Ctrl Down}{Right}{Ctrl Up}
ControlFocus,,%AR4_id%
return

но это не работает вообще. Надеюсь, что какой-нибудь суперпользователь может помочь мне в этом.

Отредактировано >>>>

Итак, теперь я попытался заставить скрипт работать, если WinExist И если WinActive, это возможно? Я сделал это так, но это не работает, CapsLock все еще вызывает ArtRage в каждом приложении.

#If WinActive("ahk_class ArtRage 3")

    #If WinExist("ahk_class ArtRage 3")

    Capslock::
    ControlSend, ahk_parent, {SC037}, ahk_class ArtRage 3   ;   NumpadMult
    return

    #If

#If

EDIT2 >>>>

Я подправил код так:

If WinActive("ahk_class ArtRage 3")

Capslock::
ControlSend, ahk_parent, {SC037}, ahk_class ArtRage 3   ;   NumpadMult
return

#If

код работает, но если ArtRage открыт (не сфокусирован) и я нахожусь в MS Word, если я нажму CapsLock, он не отправит CapsLock, но отправит "работу в тестовом режиме" в Artrage, несмотря на то, что он не фокусируется.

PD: теперь NumpadMult - это новая горячая клавиша для входа в полноэкранный режим (это проще).

2 ответа2

2

Как насчет этого?

*$vk14:: ; Capslock
{
    Send {vk11 Down} ; Ctrl
    Sleep 50
    Send {vk27 Down} ; Right arrow
    Sleep 50
    Send {vk11 Up} ; Ctrl
    Sleep 50
    Send {vk27 Up} ; Right arrow
}
Return

Иногда помогает добавление кодов клавиш и добавление времени ожидания между нажатиями / отпусканиями клавиш.

1
#If WinExist("ahk_class ArtRage 3")

    Capslock::
    WinActivate, ahk_class ArtRage 3
    WinWaitActive, ahk_class ArtRage 3
    Send {Ctrl Down}{Right}{Ctrl Up}    ; Ctrl Right is the key I set to toogle the workbench mode
    return

#If

РЕДАКТИРОВАТЬ:

Может ли быть так, что программа создает новое окно этого класса ahk_class в режиме рабочей среды? Используйте это, чтобы узнать это:

F1::
WinGet, instances, count, ahk_class ArtRage
MsgBox, There exist %instances% windows of this ahk_class.
return

EDIT2:

Попробуйте также это как отдельный скрипт (закройте все другие скрипты, которые могут мешать):

#If WinExist("ahk_class ArtRage 3")

    Capslock::
    ControlSend, ahk_parent, ^{Right}, ahk_class ArtRage 3
    ; or:
    ; ControlSend,, ^{Right}, ahk_class ArtRage 3
    return

#If

Если это не работает, прочитайте https://autohotkey.com/docs/FAQ.htm#games и попробуйте решения, упомянутые там.

EDIT3:

Ответ на вопрос, как лучше всего использовать директивы # If- или #IfWin, зависит от вашей ситуации.

The #IfWin directives are positional: 
they affect all hotkeys and hotstrings physically beneath them in the script. 
They are also mutually exclusive; that is, only the most recent one will be in effect.

https://autohotkey.com/docs/commands/_IfWinActive.htm#Basic_Operation

#if WinExist - это широкий дескриптор, но только если вы отдадите ему приоритет, то есть если вы поставите его перед другими директивами #if в скрипте. Попробуйте дать приоритет #if директивам WinActive (поместите их перед #if WinExist в вашем скрипте).

Пример:

#If WinActive("ahk_class ArtRage 3")

    Capslock:: MsgBox, You pressed Capslock while ArtRage  was active

    1:: MsgBox, You pressed 1 while ArtRage  was active 

#If WinActive("ahk_class notepad")

    Capslock:: MsgBox, You pressed Capslock while Notepad was active 

    1:: Send, 2

#If WinActive("ahk_class CabinetWClass")

    Capslock:: MsgBox, You pressed Capslock while Explorer was active 

    1:: Run %A_MyDocuments%

#If WinExist("ahk_class ArtRage 3")

    Capslock:: MsgBox, You pressed Capslock while ArtRage was inactive `n(Notepad and Explorer are not active or do not exist)

    1:: MsgBox, You pressed 1 while ArtRage was inactive`nNotepad and Explorer are not active or do not exist

#If WinExist("ahk_class IEFrame")

    Capslock:: MsgBox, You pressed Capslock while IE was inactive `nArtRage does not exist,`nNotepad and Explorer are not active or do not exist

#If                 ; end of context-sensitive hotkeys


Capslock:: MsgBox, You pressed Capslock while ArtRage and IE do not exist`nNotepad and Explorer are not active or do not exist

1::  MsgBox, You pressed 1 while ArtRage and IE do not exist`nNotepad and Explorer are not active or do not exist

Кстати: #If WinExist("ahk_class ArtRage 3") после #If WinActive("ahk_class ArtRage 3") не имеет смысла (директива #If WinActive предполагает, что это окно существует).

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