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

1

Eu uso o AHK 1.1 para definir o CapsLock como uma tecla de atalho para alternar o modo de tela cheia do ArtRage (modo workbench), porque o ArtRage não permite definir CapsLock 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 somente na primeira vez que eu ative o full screen mode e na primeira vez que eu desabilitá-lo, quero dizer que nas duas primeiras vezes pressione CapsLock , mas não funcionará a menos que eu clique manualmente na janela 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 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, CapsLock 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 CapsLock ele não enviará CapsLock , mas envie o "trabalho em benchmode" em Artrage apesar de não ser focado.

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

    
por litu16 28.11.2016 / 21:37

2 respostas

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

EDITAR:

Pode ser que o programa crie 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 link e tente as soluções mencionadas.

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.

link

#if WinExist é um identificador amplo, mas somente se você der prioridade a ele,  ou seja, se você colocar 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).

    
por 28.11.2016 / 22:29
2

Que tal isso?

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

    
por 28.11.2016 / 22:28