pinkfloyd Modérateur
Nombre de messages : 27 Age : 39 Date d'inscription : 04/12/2006
| Sujet: dététcter le mouvement d'une form Lun 8 Jan - 15:14 | |
| En VB, aucun événement ne permet d'être averti lorsqu'une form a été déplacée. Mais pour Windows l'événement existe. Il est donc possible de l'intercepter grâce au sousclassement. Copiez ce code source dans le module de la form.
vb
Private Sub Form_Load() 'Remplace la procédure de fenêtre par défaut par notre propre procédure oldWndProc = SetWindowLong(hwnd, GWL_WNDPROC, AddressOf WindowProc) End Sub
Private Sub Form_Unload(Cancel As Integer) 'Remet la procédure de fenêtre par défaut SetWindowLong hwnd, GWL_WNDPROC, oldWndProc End Sub
Et celui-ci dans un module standard.
vb
Public Declare Function SetWindowLong Lib "user32" Alias "SetWindowLongA" _ (ByVal hwnd As Long, ByVal nIndex As Long, _ ByVal dwNewLong As Long) As Long Public Const GWL_WNDPROC = (-4) Public oldWndProc As Long
Private Declare Function CallWindowProc Lib "user32" Alias "CallWindowProcA" _ (ByVal lpPrevWndFunc As Long, ByVal hwnd As Long, _ ByVal msg As Long, ByVal wParam As Long, ByVal lParam As Long) As Long Private Const WM_MOVE = &H3
Public Function WindowProc(ByVal hwnd As Long, ByVal msg As Long, _ ByVal wParam As Long, ByVal lParam As Long) As Long
If msg = WM_MOVE Then 'la form a été déplacée Form1.Cls Form1.Print "Nouvelle position : " & Form1.Left & ", " & Form1.Top End If 'Appelle la procédure de fenêtre par défaut pour que Windows puisse traiter l'évènement WindowProc = CallWindowProc(oldWndProc, hwnd, msg, wParam, lParam)
End Function
Attention, la procédure Form_Unload doit obligatoirement être exécutée. Si vous déboguez et cliquez sur Stop, l'éditeur VB plantera. Si vous fermez votre programme avec l'instruction End, la procédure Form_Unload ne sera pas exécutée et votre programme plantera. | |
|