AutoHotkey - Die Anwendung verliert den Fokus, wenn der Vollbildmodus aktiviert wird

854
litu16

Ich verwende AHK 1.1, um den CapsLock Hotkey so einzustellen, dass er den ArtRage-Vollbildmodus (Workbench-Modus) umschaltet. Ich tue dies, weil ArtRage es mir nicht erlaubt, CapsLock einen Hotkey festzulegen, aber ich bin es gewohnt, diese Taste zu verwenden Ich dachte, AHK könnte mir in vielen Programmen helfen, mein Skript war einfach:

; 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 

Das Skript funktioniert nur beim ersten Aktivieren full screen modeund beim ersten Deaktivieren der ersten beiden Male, die ich drücke CapsLock, aber dann funktioniert es nicht, wenn ich nicht manuell auf das ArtRage-Fenster klicke. In diesem Fall kann ich den Hotkey noch zweimal verwenden. Ich schätze, ich verlier mich irgendwie auf das Fenster. Ich habe auch folgendes ausprobiert:

Capslock:: ControlSend,,, ahk_class ArtRage 3 WinActivate ahk_class ArtRage 3 return #If 

Mit dem gleichen Ergebnis googelte ich darüber und versuchte es:

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

aber es funktioniert überhaupt nicht. Hoffe, ein Superuser könnte mir dabei helfen.

EDITED >>>>

Jetzt habe ich versucht, das Skript zum Laufen zu bringen, wenn WinExist UND wenn WinActive, ist das möglich? Ich habe es so gemacht, aber es funktioniert nicht, CapsLock ruft ArtRage in jeder Anwendung auf.

#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 >>>>

Ich habe den Code so angepasst:

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

der Code funktioniert, aber wenn ArtRage geöffnet ist (nicht fokussiert) und ich in MS Word bin, wenn ich drücke CapsLock, wird er nicht CapsLockgesendet, aber es wird die "Arbeit im Bankmodus" in Artrage gesendet, obwohl nicht fokussiert ist.

PD: Jetzt NumpadMultist der neue Hotkey zum Aufrufen des Vollbildmodus (es ist einfacher).

1

2 Antworten auf die Frage

2
KulaGGin

Wie wäre es damit?

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

Manchmal hilft das Hinzufügen von Tastencodes und das Hinzufügen der Ruhezeit zwischen Tastendruck / Loslassen.

Ich teste .. es scheint, dass es funktioniert, aber manchmal nicht. Funktioniert nicht Ich muss das ArtRage-Fenster nach den ersten beiden Vorgängen anklicken. litu16 vor 7 Jahren 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 

BEARBEITEN:

Kann es sein, dass das Programm ein neues Fenster dieser ahk_class im Workbench-Modus erstellt? Verwenden Sie dies, um es herauszufinden:

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

EDIT2:

Versuchen Sie es auch als eigenständiges Skript (schließen Sie alle anderen Skripts, die stören könnten):

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

Wenn dies nicht funktioniert, lesen Sie https://autohotkey.com/docs/FAQ.htm#games und probieren Sie die dort genannten Lösungen aus.

EDIT3:

Die Antwort auf die Frage, wie Sie die # If- oder #IfWin-Direktive am besten verwenden können, hängt von Ihrer Situation ab.

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 ist ein Wide-Handle, aber nur, wenn Sie es vorrangig behandeln, dh, wenn Sie es vor anderen # if-Direktiven im Skript setzen. Versuchen Sie, #if WinActive-Direktiven Priorität einzuräumen (setzen Sie sie in Ihrem Skript vor #if WinExist).

Beispiel:

#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 

BTW: #If WinExist ("ahk_class ArtRage 3") nach #If WinActive ("ahk_class ArtRage 3") macht keinen Sinn (Die #If WinActive-Direktive setzt voraus, dass dieses Fenster vorhanden ist).

Ich teste gerade, ich weiß nicht manchmal funktioniert, manchmal nicht. Funktioniert nicht Ich muss das ArtRage-Fenster nach den ersten beiden Vorgängen anklicken. litu16 vor 7 Jahren 0
Überprüfen Sie meine bearbeitete Antwort. user3419297 vor 7 Jahren 0
Nein, es erstellt keine neue Instanz von ArtRage, das AHK-Skript druckt immer "es gibt nur ein Fenster für diese ahk-Klasse. Das Merkwürdige ist, dass ich diesen Schlüssel mit zwei Makrorecordern," Key Manager "und" ", ausprobiert habe. Hot Keyboard Pro "beide funktionieren gut, ich schätze, im Artrage-Fenster ist nichts Besonderes. Kann ich in diesem Fall` contrlsend` verwenden? litu16 vor 7 Jahren 0
Siehe auch EDIT2 oben. user3419297 vor 7 Jahren 0
Dank funktionierte es mit dem `#If WinExist` und dem` ahk_parent`. Aber jetzt ist das Problem, dass Capslock Capslocks in einer anderen Anwendung nicht auslöst, wenn artrage geöffnet ist (auch nicht fokussiert ist). Stattdessen springt es zu ArtRage und drückt `^ , sodass andere Apps, die Capslock verwenden, vollständig eingeben können Der Bildschirmmodus funktioniert nicht, bis ich ArtRage oder Autohotkey schließe. Was kann ich machen? Ich redigierte meine Frage, um zu zeigen, was ich getan habe. litu16 vor 7 Jahren 0
Es gibt viele Möglichkeiten, dieses Problem zu lösen, und es hängt von Ihrer Situation ab. Ich würde eine andere Frage stellen, um darüber zu diskutieren. user3419297 vor 7 Jahren 0
Lassen Sie uns [diese Diskussion im Chat fortsetzen] (http://chat.stackexchange.com/rooms/49310/discussion-between-user3419297-and-litu16). user3419297 vor 7 Jahren 0
Eine neue Frage wäre dieser sehr ähnlich, denn es müsste irgendwie zusammenfassen, was in diesen Fragen erläutert wurde, wie zum Beispiel ... _Ich stelle AHK 1.1 ein, um den Capslock als Hotkey für den Vollbildmodus von ArtRage zu verwenden ( Workbench-Modus), da ArtRage es mir nicht erlaubt, CapsLock als Hotkey festzulegen, aber ich bin es gewohnt, diesen Schlüssel in vielen Programmen zu verwenden. Bisher ist "#if winexist" zu breit, aber wenn ich "#if winactive" verwende, funktioniert es nicht. Wie kann ich das lösen? danke fortgeschritten litu16 vor 7 Jahren 0
Siehe EDIT3 oben. user3419297 vor 7 Jahren 0
Hallo, user3419297, ich verstehe nicht, _ # ob WinExist ein breites Handle ist, aber nur, wenn Sie ihm Priorität einräumen, das heißt, wenn Sie es vor anderen # if-Direktiven im Skript setzen. Versuchen Sie, #if WinActive-Direktiven Vorrang einzuräumen (setzen Sie sie in Ihrem Skript vor #if WinExist) ._ ist es nicht das, was ich gerade getan habe? Ich habe versucht, ein weiteres # # vor `` ifWinExist` zu setzen. Könnten Sie bitte ein Beispiel für die Vorgehensweise zeigen? Ich habe in meinem Code geschrieben, wie ich dachte, ich könnte ein weiteres "# if" vor das "# ifWinExist" setzen, aber dann sagten Sie, es sei falsch, wie soll ich das machen? danke fortgeschritten litu16 vor 7 Jahren 0
Hallo user3419297Ich habe eine neue Frage zu diesem Problem gestellt. Ich hoffe, Sie könnten mir helfen. Http://superuser.com/questions/1151188/autohotkey-hotkey-overriding-key-in-all-windows-apps-in-st-of-just-of-just- Wenn-Windo dank fortgeschrittener. litu16 vor 7 Jahren 0
Siehe Beispiel in EDIT3. user3419297 vor 7 Jahren 0
Ich sehe, dass Leerzeichen beim AHK-Scripting keine Bedeutung haben. Vielen Dank für das Beispiel, jetzt denke ich, dass ich es tun könnte, aber normalerweise setze ich '#If WinActive' ein und tue dann etwas Code und dann '# if' (Ende der kontextsensitiven Hotkeys), bevor ein anderes anderes Stück Code gestartet wird, andernfalls Die meisten Hotkeys funktionieren für mich nicht. Also habe ich es als Beispiel getestet, aber ich habe die Priorität festgelegt, den Code eingegeben, dann die kontextabhängigen Hotkeys geschlossen und das neue `#IfWinActive ArtRage` geöffnet. Es hat funktioniert, aber ... würde es bedeuten, dass ich eine Art LISTE habe Alle Apps sind in ArtRage, wo ich möchte, dass der "Capslock" anders funktioniert. Danken litu16 vor 7 Jahren 0
Eine weitere Sache, die mich beim AHK-Scripting verwirrt, ist, dass die Anweisungen „If“ und „else“ geschweifte Klammern benötigen (wenn der Code in ihnen größer als eine Zeile ist), aber diese in Ihrem Beispiel nicht benötigen. Warum? litu16 vor 7 Jahren 0
hi user3419297 Ich habe es gelöst, aber ich habe Probleme, sich auf ArtRage-Fenster zu konzentrieren, nachdem das Skript ausgeführt wurde. Ich habe gepostet, was ich in dieser neuen Frage mit allen Details gemacht habe. Könnten Sie es bitte prüfen? Tahnks fortgeschritten. http://superuser.com/questions/1151188/autohotkey-hotkey-overriding-key-in-all-windows-apps-instead-of-just-if-windo litu16 vor 7 Jahren 0