AutoHotkey - приложение теряет фокус при включении полноэкранного режима

913
litu16

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

; AR4 Toggle Workbench Mode Capslock:: Send ; 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,,, ahk_class ArtRage 3 WinActivate ahk_class ArtRage 3 return #If 

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

Capslock:: WinGet, AR4_id, ID, A Send  ControlFocus,,%AR4_id% return 

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

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

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

#If WinActive("ahk_class ArtRage 3")  #If WinExist("ahk_class ArtRage 3")  Capslock:: ControlSend, ahk_parent,, ahk_class ArtRage 3 ; NumpadMult return  #If  #If 

EDIT2 >>>>

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

If WinActive("ahk_class ArtRage 3")  Capslock:: ControlSend, ahk_parent,, ahk_class ArtRage 3 ; NumpadMult return  #If 

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

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

1

2 ответа на вопрос

2
KulaGGin

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

*$vk14:: ; Capslock { Send ; Ctrl Sleep 50 Send ; Right arrow Sleep 50 Send ; Ctrl Sleep 50 Send ; Right arrow } Return 

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

Я тестирую .. кажется, что это работает, но иногда нет. Не работает, я все равно должен сделать щелчок на окне ArtRage после выполнения первых двух раз, любая идея? litu16 7 лет назад 0
1
user3419297
#If WinExist("ahk_class ArtRage 3")  Capslock:: WinActivate, ahk_class ArtRage 3 WinWaitActive, ahk_class ArtRage 3 Send ; 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, ^, ahk_class ArtRage 3 ; or: ; ControlSend,, ^, 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 предполагает, что это окно существует).

Я сейчас тестирую, я не знаю, иногда работает, иногда нет. Не работает, я все равно должен сделать щелчок на окне ArtRage после выполнения первых двух раз, любая идея? litu16 7 лет назад 0
Проверьте мой отредактированный ответ. user3419297 7 лет назад 0
Нет, он не создает новый экземпляр ArtRage, скрипт AHK всегда выводит «есть только 1 окно для этого класса ahk. Любопытно, что я пробовал этот ключ с двумя макро-регистраторами,« Key Manager »и« Hot Keyboard Pro "оба работают нормально, поэтому я думаю, что в окне Artrage нет ничего особенного. Могу ли я использовать` contrlsend` в этом случае? litu16 7 лет назад 0
Смотрите также EDIT2 выше. user3419297 7 лет назад 0
спасибо, это сработало с использованием `#If WinExist` и` ahk_parent`. Но теперь проблема в том, что если artrage открыт (даже не сфокусирован), Capslock не будет запускать Capslock в любом другом приложении, вместо этого он перейдет к ArtRage и нажмет `^ `, так что другие приложения, использующие Capslock для полного входа. Режим экрана не будет работать, пока я не закрою ArtRage или Autohotkey. Что я могу сделать? Я отредактировал мой вопрос, чтобы показать, что я сделал, Спасибо, Advanced. litu16 7 лет назад 0
Есть много способов решить эту проблему, и это будет зависеть от вашей ситуации. Я бы начал другой вопрос, чтобы обсудить это. user3419297 7 лет назад 0
Давайте [продолжим это обсуждение в чате] (http://chat.stackexchange.com/rooms/49310/discussion-between-user3419297-and-litu16). user3419297 7 лет назад 0
Новый вопрос был бы очень похож на этот, потому что ему нужно было бы подвести итог всему тому, что было объяснено в этих вопросах, например ... _Я использую AHK 1.1, чтобы установить capslock как горячую клавишу для переключения в полноэкранном режиме ArtRage ( режим рабочей среды), я делаю так, потому что ArtRage не позволяет мне устанавливать capslock как горячую клавишу, но я довольно привык использовать эту клавишу, чтобы сделать это во многих программах_. Пока что `#if winexist` достаточно широк, но если я использую` #if winactive`, это не сработает, как я могу решить эту проблему? спасибо заранее. litu16 7 лет назад 0
Смотрите EDIT3 выше. user3419297 7 лет назад 0
Привет, user3419297, я не понимаю, _ # если WinExist имеет широкий дескриптор, но только если вы отдаете ему приоритет, то есть если вы поставите его перед другими директивами #if в скрипте. Попробуйте дать приоритет #if директивам WinActive (поместите их перед #if WinExist в вашем скрипте) ._ Разве это не то, что я только что сделал ?, Я попытался поместить еще один `# If` перед` # ifWinExist`. Не могли бы вы показать пример, как это сделать? Я написал в своем отредактированном коде, как я думал, что мог бы поставить еще один `# if` перед` # ifWinExist`, но потом вы сказали, что это неправильно, как мне это сделать? спасибо заранее. litu16 7 лет назад 0
Привет, user3419297Я задала новый вопрос об этой проблеме. Надеюсь, вы мне поможете http://superuser.com/questions/1151188/autohotkey-hotkey-overriding-key-in-all-windows-apps-instead-of-just- if-windo спасибо, продвинутый. litu16 7 лет назад 0
Смотрите пример в EDIT3. user3419297 7 лет назад 0
Я вижу, что пробелы не имеют смысла в скриптах AHK. Спасибо за пример, теперь я думаю, что смогу это сделать, но я обычно ставлю `#If WinActive`, затем делаю некоторый код, затем` # if` (конец контекстно-зависимых горячих клавиш) перед запуском другого другого куска кода, иначе большинство горячих клавиш мне не подойдут. Итак, я протестировал в качестве вашего примера, но я установил приоритет, поместил код, затем закрыл контекстно-зависимые горячие клавиши и открыл новый `#IfWinActive ArtRage`, и это сработало, но ... это означало бы, что мне нужно вроде LIST все приложения разные, кроме ArtRage, где я хочу, чтобы «capslock» работал по-разному. Поблагодарить litu16 7 лет назад 0
Еще одна вещь, которая смущает меня в сценариях AHK, заключается в том, что операторам `If` и` else` нужны фигурные скобки (если код внутри них больше 1 строки), но они в вашем примере не нужны, почему? litu16 7 лет назад 0
привет user3419297 Я решил это, но у меня проблемы с перефокусировкой в ​​окне ArtRage после запуска скрипта, я опубликовал, что я сделал в этом новом вопросе со всеми деталями, не могли бы вы проверить это? танкс продвинутый. http://superuser.com/questions/1151188/autohotkey-hotkey-overriding-key-in-all-windows-apps-instead-of-just-if-windo litu16 7 лет назад 0

Похожие вопросы