J'essaie de configurer un raccourci clavier pour toujours lancer une nouvelle fenêtre WindowsTerminal et lui donner le focus. Même s'il y a une fenêtre existante, je veux toujours qu'elle crée une nouvelle fenêtre. Je parviens à faire fonctionner la nouvelle fenêtre, mais j'ai du mal à en faire la fenêtre active.

Capturer le pid pendant la commande Run et utiliser ahk_pid ne semble pas fonctionner car le pid change entre le lancement et la fenêtre active qui apparaît (le débogage de msgbox montre un pid, Window Spy montre un pid différent) . L'utilisation de WinWait, ahk_exe WindowsTerminal.exe semble revenir tout de suite à saisir une fenêtre préexistante.

#t::
Run, wt.exe, , , TermPid

;; TermPid seems to change between the launch and the final window that appears
WinWait, ahk_pid %TermPid%, , 3
if ErrorLevel {
  MsgBox, WinWait timed out... %TermPid%
  return
} else {
  WinActivate
}

;; problems when there are other already existing WindowsTerminal.exe windows
;WinWait, ahk_exe WindowsTerminal.exe, , 3
;if ErrorLevel {
;  MsgBox, WinWait timed out...
;  return
;} else {
;  WinActivate
;}

return
1
Danny G 21 oct. 2020 à 20:42

2 réponses

Meilleure réponse

J'ai essayé de créer un tableau avant et après contenant les PID pour déterminer quel processus était le nouveau, mais le ciblage du dernier PID dans le tableau créé ci-dessous semble fonctionner tel quel.

Code:

#t::

Run, wt.exe
;If you are on a slow computer, you may need to increase this delay
Sleep 100 ;Forgot how to optimize this w/ WinWait, but not important rn bc its not critical
newArray:=[]

for proc in ComObjGet("winmgmts:").ExecQuery("Select * from Win32_Process"){
    
    
    
    
    if(proc.Name=="WindowsTerminal.exe"){
        prID := proc.ProcessId
        newArray.Push(prID)
    }
    
    
    
}


LastItem:=newArray[newArray.MaxIndex()]
WinActivate, ahk_pid %LastItem%

return
1
Spyre 21 oct. 2020 à 20:10

Vous pouvez utiliser le Fonction RegisterShellHookWindow pour activer la nouvelle fenêtre dès sa création:

#Persistent
SetBatchLines, -1
Process, Priority,, High
#SingleInstance Force

Gui +LastFound
hWnd := WinExist()
DllCall( "RegisterShellHookWindow", UInt,hWnd )
MsgNum := DllCall( "RegisterWindowMessage", Str,"SHELLHOOK" )
OnMessage( MsgNum, "ShellMessage" )
Return


#t:: Run, wt.exe


ShellMessage( wParam,lParam ) {
    If ( wParam = 1 ) ;  HSHELL_WINDOWCREATED := 1
    {
        WinGet, ProcName, ProcessName, ahk_id %lParam%
        If  ( ProcName = "WindowsTerminal.exe" ) 
            WinActivate, ahk_id %lParam%
    }
}
0
user3419297 21 oct. 2020 à 19:55