[R] Utiliser le PID pour un WinMove?

Aide et conseils concernant AutoIt et ses outils.
Règles du forum
.
Répondre
Nilak
Niveau 4
Niveau 4
Messages : 57
Enregistré le : mar. 25 mai 2010 21:29
Status : Hors ligne

[R] Utiliser le PID pour un WinMove?

#1

Message 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
Modifié en dernier par Nilak le ven. 18 juin 2010 16:18, modifié 1 fois.
Avatar du membre
Tlem
Site Admin
Site Admin
Messages : 11824
Enregistré le : ven. 20 juil. 2007 21:00
Localisation : Bordeaux
Status : Hors ligne

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

#2

Message 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. ;)
Thierry

Rechercher sur le forum ----- Les règles du forum
Le "ça ne marche pas" est une conséquence commune découlant de beaucoup trop de raisons potentielles ...

Une idée ne peut pas appartenir à quelqu'un. (Albert Jacquard) tiré du documentaire "Copié n'est pas volé".
Avatar du membre
timmalos
Niveau 11
Niveau 11
Messages : 1970
Enregistré le : dim. 18 mai 2008 15:16
Status : Hors ligne

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

#3

Message 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
Avatar du membre
Tlem
Site Admin
Site Admin
Messages : 11824
Enregistré le : ven. 20 juil. 2007 21:00
Localisation : Bordeaux
Status : Hors ligne

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

#4

Message par Tlem »

Cette fonction serait pas mal dans le forum Fonctions et UDF (pour les futur recherches). :mrgreen:
Thierry

Rechercher sur le forum ----- Les règles du forum
Le "ça ne marche pas" est une conséquence commune découlant de beaucoup trop de raisons potentielles ...

Une idée ne peut pas appartenir à quelqu'un. (Albert Jacquard) tiré du documentaire "Copié n'est pas volé".
Nilak
Niveau 4
Niveau 4
Messages : 57
Enregistré le : mar. 25 mai 2010 21:29
Status : Hors ligne

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

#5

Message par Nilak »

Merci bien, je ne savais pas qu'on pouvait appeler le handle à la place du nom.^^

Je passe en résolu.
Répondre