Questão AutoHotkey - aplicativo perdendo o foco ao ativar o modo de tela cheia


Eu uso o AHK 1.1 para definir o Caps Lock  para ser uma tecla de atalho para alternar o modo de tela cheia ArtRage (modo workbench), eu o faço porque o ArtRage não me permite definir Caps Lock  como uma tecla de atalho, mas eu estou bastante acostumado a usar essa chave para fazer isso em muitos programas, então eu pensei que o AHK poderia me ajudar, meu script era simples:

;   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

O script funciona apenas na primeira vez que eu ativar o full screen mode e a primeira vez que eu desabilitá-lo, quero dizer as duas primeiras vezes que eu pressiono Caps Lock , mas não funcionará a menos que eu clique manualmente na janela do ArtRage. Se eu fizer isso, posso usar a tecla de atalho mais duas vezes. Então eu acho que estou de alguma forma perdendo o foco na janela. Eu tentei também isso:

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

com o mesmo resultado, eu pesquisei sobre isso e tentei:

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

mas não funciona de todo. Espero que algum superusuário possa me ajudar nessa.

EDITADO >>>>

Então agora eu tentei fazer o script funcionar se WinExist e se WinActive, isso é possível? Eu fiz assim, mas não funciona Caps Lock  ainda chama ArtRage em todas as aplicações.

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

Eu ajustei o código assim:

If WinActive("ahk_class ArtRage 3")

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

#If

o código funciona, mas se o ArtRage estiver aberto (não focado) e eu estiver no MS Word, se eu pressionar Caps Lock  não vai enviar Caps Lock mas vai enviar o "trabalho em benchmode" em Artrage apesar de não estar focado.

PD: agora NumpadMult é a nova tecla de atalho para entrar no modo de tela cheia (é mais fácil).


1


origem




Respostas:


#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

EDITAR:

Será que o programa cria uma nova janela desta ahk_class no modo de bancada? Use isto para descobrir:

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

EDIT2:

Tente também como script autônomo (feche todos os outros scripts que possam interferir):

#If WinExist("ahk_class ArtRage 3")

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

#If

Se isso não funcionar, leia https://autohotkey.com/docs/FAQ.htm#games e tente as soluções mencionadas lá.

EDIT3:

A resposta para a pergunta sobre como usar melhor as diretivas # If ou #IfWin depende da sua situação.

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 é um identificador amplo, mas somente se você der prioridade a ele,  isto é, se você colocá-lo antes outras diretivas #if no script. Tente dar prioridade às diretivas #if WinActive (coloque-as antes do #if WinExist no seu script).

Exemplo:

#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: #Se WinExist ("ahk_class ArtRage 3") após #If WinActive ("ahk_class ArtRage 3") não faz sentido (a diretiva #If WinActive pressupõe que essa janela exista).


1



Atualmente estou testando, não sei às vezes funciona, às vezes não. Não funciona ainda tenho que fazer clique na janela ArtRage depois de realizar as duas primeiras vezes, alguma ideia? - litu16
Verifique minha resposta editada. - user3419297
Nop, ele não cria uma nova instância de ArtRage, o script AHK sempre imprime "há apenas uma janela para essa classe de caracteres. O curioso é que eu tentei essa chave com dois gravadores de macro," Gerenciador de chaves "e" Hot Keyboard Pro "ambos funcionam bem, então eu acho que não há nada de especial na janela Artrage. Posso usar contrlsendnesse caso? - litu16
Veja também EDIT2 acima. - user3419297
obrigado funcionou usando o #If WinExist e a ahk_parent. Mas agora o problema é que, se a artragem estiver aberta (mesmo que não esteja focada), o Capslock não irá disparar o Capslock em qualquer outra aplicação, em vez disso irá pular para o ArtRage e pressionar ^{Right}, portanto, outros aplicativos que usam o Capslock para entrar no modo de tela inteira não funcionarão até que eu feche o ArtRage ou o Autohotkey. O que eu posso fazer? Editei minha pergunta para mostrar o que fiz, Obrigado Advanced. - litu16


Que tal agora?

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

Às vezes, adicionar códigos-chave e adicionar tempo de espera entre pressionamentos de tecla / releases ajuda.


2



Estou testando .. parece que funciona, mas às vezes não. Não funciona ainda tenho que fazer clique na janela ArtRage depois de realizar as duas primeiras vezes, alguma ideia? - litu16