Page 1 sur 1

[R] Utiliser le PID pour un WinMove?

Posté : mer. 16 juin 2010 19:51
par Nilak
Bonsoir,

J'ai un petit problème, j'essaye de lancer plusieurs la même application et d'effectuer des opérations dessus, le problème c'est qu'au bout d'un moment ma machine s'en mêle les pinceaux et n'effectuent plus les opérations sur la bonne fenêtre. Il est évidemment possible d'utiliser des sleeps, mais je trouve ça assez moche.

Dans l'aide autoit, j'ai vu qu'on pouvait -apparemment- utiliser les PID dans la rubrique "Controls", j'ai essayé ça:

Code : Tout sélectionner

 Run("notepad.exe", "" )
WinWait("notepad.exe")
$pid1 = WinGetProcess ( "Notepad.exe","" )
WinActivate([ID:$pid1],"")
WinMove([ID:$pid1], "", 0, 0, 910, 749)

Run("notepad.exe", "" )
WinWait("notepad.exe")
$pid2 = WinGetProcess ( "Notepad.exe","" )
WinActivate([ID:$pid2],"") 
WinMove([ID:$pid2], "", 1011, 0, 910, 749)
Mais évidemment, ça ne marche pas car il manque des "... Mais si je les mets des " le $pidx n'est plus chargé. Ma question est donc possible de modifier la taille, la position d'une fenêtre sur une donnée unique?

Merci

Re: [..] Utiliser le PID pour un WinMove?

Posté : mer. 16 juin 2010 22:16
par Tlem
Pour obtenir le PID de votre notepad, utilisez plutôt :

Code : Tout sélectionner

$Pid1 = Run("notepad.exe", "" )
En ce qui concerne le WinActivate, utilisez plutôt le handle de la fenêtre.

Code : Tout sélectionner

WinActivate($Handle1,"")
Pour cela, utilisez WinList qui vous renverra un tableau de toutes les fenêtres présentes, avec leur Handle.
Donc comme vous avez le PID, vous pouvez facilement avoir le handle en utilisant WinGetProcess sur chaque titre de fenêtre et en comparant le retour avec le PID de vos fenêtres. ;)

Re: [..] Utiliser le PID pour un WinMove?

Posté : mer. 16 juin 2010 22:27
par timmalos
Tlem a écrit : En ce qui concerne le WinActivate, utilisez plutôt le handle de la fenêtre.

Code : Tout sélectionner

WinActivate($Handle1,"")
Pour l'instant, tu fais tout comme l'a dit Tlem
Tlem a écrit : Pour cela, utilisez WinList qui vous renverra un tableau de toutes les fenêtres présentes, avec leur Handle.
Donc comme vous avez le PID, vous pouvez facilement avoir le handle en utilisant WinGetProcess sur chaque titre de fenêtre et en comparant le retour avec le PID de vos fenêtres. ;)
Ici je propose une petite simplification en utilisant directement la fonction dédiée:

Code : Tout sélectionner

Func _GetHwndFromPID($PID)
    $hWnd = 0
    $stPID = DllStructCreate("int")
    Do
        $winlist2 = WinList()
        For $i = 1 To $winlist2[0][0]
            If $winlist2[$i][0] <> "" Then
                DllCall("user32.dll", "int", "GetWindowThreadProcessId", "hwnd", $winlist2[$i][1], "ptr", DllStructGetPtr($stPID))
                If DllStructGetData($stPID, 1) = $PID Then
                    $hWnd = $winlist2[$i][1]
                    ExitLoop
                EndIf
            EndIf
        Next
        Sleep(100)
    Until $hWnd <> 0
    Return $hWnd
EndFunc ;==>_GetHwndFromPID

Re: [..] Utiliser le PID pour un WinMove?

Posté : mer. 16 juin 2010 23:55
par Tlem
Cette fonction serait pas mal dans le forum Fonctions et UDF (pour les futur recherches). :mrgreen:

Re: [..] Utiliser le PID pour un WinMove?

Posté : ven. 18 juin 2010 16:18
par Nilak
Merci bien, je ne savais pas qu'on pouvait appeler le handle à la place du nom.^^

Je passe en résolu.