Page 1 sur 1
[..] Contrôler le changement de position d'une fenêtre d'app
Posté : lun. 03 févr. 2014 19:10
par papami
Bonjour
Comme avec WM_MOVE pour une GUI, est-il possible de détecter le déplacement d'une fenêtre quelconque autrement que par des WinGetPos("titre"... incessants dans la boucle principale
Ceci pour lier une petite gui à une autre fenêtre, Notepad, SciTe, ou autre.
Merci.
Re: [..] contrôler le changement de position d'une fenêtre d
Posté : lun. 03 févr. 2014 21:45
par jguinch
autrement que par des WinGetPos("titre"... incessants dans la boucle principale : malheureusement, il n'y a guère d'autre solution.
Si ton problème est la boucle principale, tu peux dédier le travail de surveilance à une fonction appelée par AdlibRegister.
Re: [..] Contrôler le changement de position d'une fenêtre d
Posté : lun. 03 févr. 2014 22:36
par Tlem
Ben sinon, il y a la solution du
GUIRegisterMsg pour le message
WM_MOVE.
Il me semble bien que cela a déjà été discuté sur le forum.
Re: [..] Contrôler le changement de position d'une fenêtre d
Posté : mar. 04 févr. 2014 11:31
par TommyDDR
Je pense qu'en soulignant "quelconque" il voulait parler d'une fenêtre pas forcément créé par ses soins.
Re: [..] Contrôler le changement de position d'une fenêtre d
Posté : mar. 04 févr. 2014 13:28
par Tlem
Oui. J'avais bien compris.
Il suffit de donner le bon hanche.
Envoyé depuis mon appareil mobile.
Re: [..] Contrôler le changement de position d'une fenêtre d
Posté : mar. 04 févr. 2014 14:25
par TommyDDR
"Envoyé depuis mon appareil mobile"
Donc je suppose que l'auto-correction à transformé "handle" en "hanche"
Mais GUIRegisterMsg ne prends pas de handle en paramètre
(J'avais ouvert un topic pour le même sujet mais tu m'avais dit que c'était pas possible en GUIRegisterMsg)
Re: [..] Contrôler le changement de position d'une fenêtre d
Posté : mar. 04 févr. 2014 20:59
par Tlem
TommyDDR a écrit :je suppose que l'auto-correction à transformé "handle" en "hanche"
Heuu, effectivement.
TommyDDR a écrit :Mais GUIRegisterMsg ne prends pas de handle en paramètre
Je n'ai jamais parlé des paramètres de la fonction !
Le but est d'enregistrer le message Windows de déplacement d'une fenêtre (paramètre
msgID) et d'y appliquer une fonction.
Ensuite dans la fonction appliquée pour
GUIRegisterMsg, on contrôle les éléments qui concernent uniquement la fenêtre cible (d’où le handle).
La section "
Remarks" de la fonction
GUIRegisterMsg montre de quoi je veux parler. D'ailleurs, l'exemple fournit dans la doc AutoIt 3.3.9.0 me parait sympa.
Après, je n'affirme pas que ça fonctionne pour une fenêtre en dehors de la GUI du script, mais c'est à essayer.
Edit : Effectivement,
GUIRegisterMsg semble ne 'capter' que les événements liés au script lui même.
J'ai trouvé ça, mais on repart sur une boucle de gestion des fenêtres :
http://www.autoitscript.com/forum/topic ... egistermsg
Re: [..] Contrôler le changement de position d'une fenêtre d
Posté : mar. 04 févr. 2014 22:20
par jguinch
Bon, je viens de bricoler un petit exemple bien tordu.
Mais je préfère largement utiliser WinGetPos en boucle plutôt que mon truc...
► Afficher le texte
Code : Tout sélectionner
#include <WinAPISys.au3>
#include <APISysConstants.au3>
#include <WindowsConstants.au3>
OnAutoItExitRegister('OnAutoItExit')
Run(@SystemDir & '\notepad.exe')
WinWait("[CLASS:Notepad]")
Global $hNotepad = WinGetHandle("[CLASS:Notepad]")
Global $hGUi = GUICreate("Ma GUI", 0, 0, 0, 0, $WS_POPUP)
GUISetBkColor(0)
GUISetState()
Local $hEventProc = DllCallbackRegister('_EventProc', 'none', 'ptr;dword;hwnd;long;long;dword;dword')
Local $hEventHook = _WinAPI_SetWinEventHook($EVENT_SYSTEM_MOVESIZESTART, $EVENT_SYSTEM_MOVESIZEEND, DllCallbackGetPtr($hEventProc))
While WinExists($hNotepad)
Sleep(100)
WEnd
Func OnAutoItExit()
_WinAPI_UnhookWinEvent($hEventHook)
DllCallbackFree($hEventProc)
EndFunc ;==>OnAutoItExit
Func _EventProc($hEventHook, $iEvent, $hWnd, $iObjectID, $iChildID, $iThreadID, $iEventTime)
#forceref $hEventHook, $iObjectID, $iChildID, $iThreadID, $iEventTime
If $hWnd = $hNotepad Then
If $iEvent = $EVENT_SYSTEM_MOVESIZESTART Then
AdlibRegister("_CaBouge", 10)
ElseIf $iEvent = $EVENT_SYSTEM_MOVESIZEEND Then
AdlibUnRegister("_CaBouge")
EndIf
EndIf
EndFunc ;==>_EventProc
Func _CaBouge()
$aPos = WinGetPos($hNotepad)
If @error Then Return
WinMove($hGUi, "", $aPos[0] + $aPos[2], $aPos[1], 150, $aPos[3])
ConsoleWrite("Position de la fenetre " & WinGetTitle($hNotepad) & " : X=" & $aPos[0] & " ; Y=" & $aPos[1] & " ; Largeur=" & $aPos[2] & " ; Hauteur=" & $aPos[3] & @CRLF)
EndFunc
Re: [R] Contrôler le changement de position d'une fenêtre d
Posté : mer. 05 févr. 2014 16:56
par papami
Bonjour et MERCI à tous :
Je reprends le train en marche car je croyais bien avoir coché la case 'suivre le sujet' ... et j'attendais dans mon coin. Mais rien n'est venu ... Donc ce n'est qu'en repassant sur le forum que je vois vos contributions.
Alors, dans l'ordre :
jguinch : AdlibRegister n'apporte rien de mieux, vu que son fonctionnement est bloquant
Tlem : oui GUIRegisterMsg comme son nom l'indique ne traite que les infos en provenance de la GUI
TommyDDR :
"Je pense qu'en soulignant "quelconque" il voulait parler d'une fenêtre pas forcément créé par ses soins." c'est cela même
jguinch :
"Bon, je viens de bricoler un petit exemple bien tordu. Mais je préfère largement utiliser WinGetPos en boucle plutôt que mon truc..."
ben solution originale qui m'a 'forcé' à télécharger la dernière version d'Autoit car mes vieilles n'ont pas les Include...
Mais cela n'est pas encore l'idéal : si on secoue un peu Notepad de droite à gauche on voit bien que la GUI décolle de quelques pixels : ce n'est pas un drame en soi, mais effectivement le WinGetPos fait aussi bien en pas plus compliqué
Résultat des courses :
- S'il s'agit de manipuler deux GUI le contrôle par event (WM_MOVE) est parfait, les deux fenêtres sont vraiment scotchées.
- S'il s'agit d'une fenêtre Win autre (dont on ne peut recevoir d'event), suivie par une GUI, les deux sont bien 'collées' tant qu'il n'y a rien d'autre dans le While que les calculs de position, mais il y a des petits défauts au décollage dès que le While contrôle d'autres éléments.
En attendant mieux je vais m'en contenter.
Mais étant bricoleur je vais réfléchir un peu plus au problème
Merci encore à tous.
P.S. sans avoir touché aux cases à cocher, la 'M'avertir ' est bien cochée. Donc pourquoi n'ai-je rien reçu ?