AutoHotkey - aplikasi kehilangan fokus saat mengaktifkan mode layar penuh

1

Saya menggunakan AHK 1.1 untuk mengatur CapsLock agar menjadi hotkey untuk mengaktifkan mode layar penuh ArtRage (mode workbench), saya melakukannya karena ArtRage tidak mengizinkan saya untuk menetapkan CapsLock sebagai hotkey, tapi saya cukup terbiasa menggunakan kunci itu untuk melakukan bahwa dalam banyak program, jadi saya pikir AHK dapat membantu saya, skrip saya sederhana:

;   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

Script hanya berfungsi saat pertama kali saya mengaktifkan full screen modedan pertama kali saya menonaktifkannya, maksud saya dua kali pertama saya menekan CapsLock, tetapi kemudian tidak akan berfungsi kecuali saya mengklik secara manual pada jendela ArtRage. Jika saya melakukannya saya dapat menggunakan hotkey dua kali lagi. Jadi saya kira saya kehilangan fokus pada jendela. Saya juga sudah mencoba ini:

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

dengan hasil yang sama, saya google tentang hal itu, dan saya mencoba:

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

tetapi tidak berhasil sama sekali. Semoga beberapa pengguna super bisa membantu saya dalam hal ini.

Diedit >>>>

Jadi Sekarang saya telah mencoba membuat skrip berfungsi jika WinExist DAN jika WinActive, apakah itu mungkin? Saya membuatnya seperti ini, tetapi tidak berhasil, CapsLock masih memanggil ArtRage di setiap aplikasi.

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

Saya mengubah kode seperti ini:

If WinActive("ahk_class ArtRage 3")

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

#If

kode berfungsi, tetapi jika ArtRage terbuka (tidak fokus) dan saya di MS Word, jika saya tekan CapsLock tidak akan mengirim CapsLocktetapi akan mengirim "bekerja di benchmode" di Artrage meskipun tidak fokus.

PD: Sekarang NumpadMultadalah hotkey baru untuk masuk ke mode layar penuh (lebih mudah).

litu16
sumber

Jawaban:

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

EDIT:

Mungkinkah program membuat jendela baru ahk_class ini dalam mode workbench? Gunakan ini untuk mengetahuinya:

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

EDIT2:

Coba juga ini sebagai skrip mandiri (tutup semua skrip lain yang dapat mengganggu):

#If WinExist("ahk_class ArtRage 3")

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

#If

Jika tidak berhasil, baca https://autohotkey.com/docs/FAQ.htm#games dan coba solusi yang disebutkan di sana.

EDIT3:

Jawaban untuk pertanyaan bagaimana cara terbaik menggunakan arahan # If- atau #IfWin tergantung pada situasi Anda.

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

# jika WinExist adalah pegangan lebar, tetapi hanya jika Anda memberikan prioritas untuk itu, yaitu, jika Anda memasukkannya sebelum arahan # jika lain dalam script. Cobalah untuk memprioritaskan #jika arahan WinActive (taruh sebelum #jika WinExist dalam skrip Anda).

Contoh:

#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: #Jika WinExist ("ahk_class ArtRage 3") setelah #Jika WinActive ("ahk_class ArtRage 3") tidak masuk akal (Arahan #Jika WinActive mengandaikan bahwa jendela ini ada).

pengguna3419297
sumber
Saya sedang menguji, saya tidak tahu kadang-kadang bekerja, kadang tidak. Tidak berfungsi, saya masih harus melakukan klik pada jendela ArtRage setelah melakukan dua kali pertama, ada ide?
litu16
Periksa jawaban saya yang diedit.
user3419297
Tidak, itu tidak membuat instance baru dari ArtRage, skrip AHK selalu mencetak "hanya ada 1 jendela untuk kelas ahk ini. Yang aneh adalah bahwa saya telah mencoba kunci itu dengan dua perekam makro," Manajer Kunci "dan" Hot Keyboard Pro "keduanya berfungsi dengan baik, jadi saya rasa tidak ada yang istimewa di jendela Artrage. Dapatkah saya gunakan contrlsenddalam kasus ini?
litu16
Lihat juga EDIT2 di atas.
user3419297
terima kasih itu berhasil menggunakan #If WinExistdan ahk_parent. Tetapi sekarang masalahnya adalah bahwa jika artrage terbuka (bahkan tidak fokus) Capslock tidak akan memecat Capslock di aplikasi lain, melainkan itu akan melompat ke ArtRage dan tekan ^{Right}, sehingga aplikasi lain yang menggunakan Capslock untuk masuk dalam mode layar penuh tidak akan berfungsi , sampai saya menutup ArtRage atau Autohotkey. Apa yang dapat saya? Saya mengedit pertanyaan saya untuk menunjukkan apa yang saya lakukan, Terima kasih tingkat lanjut.
litu16
2

Bagaimana dengan ini?

*$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

Terkadang menambahkan kode kunci dan menambah waktu tidur di antara penekanan / pelepasan kunci membantu.

KulaGGin
sumber
Saya sedang menguji .. sepertinya berhasil, tapi kadang tidak. Tidak berfungsi, saya masih harus melakukan klik pada jendela ArtRage setelah melakukan dua kali pertama, ada ide?
litu16