Ceci est une page optimisée pour les mobiles. Cliquez sur ce texte pour afficher la vraie page.

XL 2016 VBA - Comment détecter la changement de position d'une fenêtre ?

Dudu2

XLDnaute Barbatruc
Bonjour,

En gestion des évènements d'une fenêtre on a ces options:

Il n'y a pas d'évènement WindowLayout() comme il y a un évènement UserForm_Layout() et donc on ne peut pas détecter de déplacement de la Window.

Y a-t-il une parade à part faire mouliner sans fin une macro pour surveiller le layout de la Window ?
 
Dernière édition:
Solution
Et donc après une bonne dizaine d'heures de tests pour trouver la cause et la parade !!!
Ça m'a épuisé !

La cause: Après une initialisation du projet dans le VBE et uniquement dans ce cas (faut quand même le faire Excel !!!) crash Excel à cause d'un conflit entre l'évènement Application WindowResize et l'évènement SetWinEventHook EVENT_SYSTEM_MOVESIZEEND.

La parade: Désactiver les évènements Application sur l'évènement SetWinEventHook EVENT_SYSTEM_MOVESIZESTART et les réactiver sur EVENT_SYSTEM_MOVESIZEEND pour empêcher l'évènement Application WindowResize de se produire car ce dernier arrive entre les 2.

Dudu2

XLDnaute Barbatruc
@jurassic pork,
Si c'est le LongLong alors il faut déclarer le 32bit en Currency.
Il faudrait que @patricktoulon fasse les essais sur sa config.

@patricktoulon,
Je vais regarder ton code de souris.

Sinon, j'ai intégré le code fourni par @jurassic pork dans un module.
Hélas on ne peut pas le mettre directement dans une Classe à cause du AdressOf qui n'a pas de résolution dynamique.
Pour faire suite à la remarque ce @jurassic pork sur les Application.OnTime, puisque l'appel de la fonction utilisateur sur l'Event Move est synchrone, j'ai protégé la fonction de "callaback" d'une double exécution avec un Static car en effet avec ces Hook, on ne sait jamais même si sur un Move la probabilité de simultanéité est minime sauf si la fonction utilisateur appelée dure des plombes.
 

Pièces jointes

  • Window Events.xlsm
    40.1 KB · Affichages: 2

patricktoulon

XLDnaute Barbatruc
re
et alors?
les pseudos event ne sont appelés par la mouseproc uniquement si la fenêtre a bougé
sinon ca tourne aucune incidence sur le reste des mouse (down/move/up )sur le reste de l'application
mousedown et oldleft sont là pour ça
on est dans le même;principe que set timer sauf que l'on a la possibilité de détetecter a quel moment on demarre le déplacement et a quel moment on arrête
faudra voir les les déclaration 64 sont bonne j'ai un soucis avec la tienne chez moi dans le vba7 sur la copimemory
 

Dudu2

XLDnaute Barbatruc
Par exemple:
VB:
#If VBA7 Then
   #If Win64 Then
       Private Declare PtrSafe Function getFrequency Lib "kernel32" Alias "QueryPerformanceFrequency" (Frequency As LongLong) As Long
       Private Declare PtrSafe Function GetTickCount Lib "kernel32" Alias "QueryPerformanceCounter" (TickCount As LongLong) As Long
   #Else
       Private Declare PtrSafe Function getFrequency Lib "kernel32" Alias "QueryPerformanceFrequency" (Frequency As Currency) As Long
       Private Declare PtrSafe Function GetTickCount Lib "kernel32" Alias "QueryPerformanceCounter" (TickCount As Currency) As Long
   #End If
#Else
    Private Declare Function getFrequency Lib "kernel32" Alias "QueryPerformanceFrequency" (Frequency As Currency) As Long
    Private Declare Function getTickCount Lib "kernel32" Alias "QueryPerformanceCounter" (TickCount As Currency) As Long
#End If
 

patricktoulon

XLDnaute Barbatruc
@Dudu2 même erreu au même endroit

c'et la
VB:
Private Declare PtrSafe Function SetWinEventHook Lib "user32.dll" (ByVal EventMin As Long, ByVal EventMax As Long, ByVal hmodWinEventProc As LongLong, ByVal lpfnWinEventProc As LongLong, ByVal idProcess As Long, ByVal idThread As Long, ByVal dwFlags As Long) As Long
 

patricktoulon

XLDnaute Barbatruc
comme ca ca a l'air de fonctionner
Code:
#If VBA7 Then
   #If Win64 Then
   Private Declare PtrSafe Function SetWinEventHook Lib "user32.dll" (ByVal EventMin As Long, ByVal EventMax As Long, ByVal hmodWinEventProc As LongLong, ByVal lpfnWinEventProc As LongLong, ByVal idProcess As Long, ByVal idThread As Long, ByVal dwFlags As Long) As Long
   #Else
    Private Declare PtrSafe Function SetWinEventHook Lib "user32.dll" (ByVal EventMin As Long, ByVal EventMax As Long, ByVal hmodWinEventProc As LongPtr, ByVal lpfnWinEventProc As LongPtr, ByVal idProcess As Long, ByVal idThread As Long, ByVal dwFlags As Long) As Long
 
   #End If
   Private Declare PtrSafe Function GetCurrentProcessId Lib "kernel32" () As Long
    Private Declare PtrSafe Function GetWindowThreadProcessId Lib "user32" (ByVal hWnd As LongPtr, lpdwProcessId As Long) As Long
    Private Declare PtrSafe Function UnhookWinEvent Lib "user32.dll" (ByVal hWinEventHook As LongPtr) As Long
#Else
    Private Declare Function SetWinEventHook Lib "user32.dll" (ByVal EventMin As Long, ByVal EventMax As Long, ByVal hmodWinEventProc As Long, ByVal lpfnWinEventProc As Long, ByVal idProcess As Long, ByVal idThread As Long, ByVal dwFlags As Long) As Long
    Private Declare Function GetCurrentProcessId Lib "kernel32" () As Long
    Private Declare Function GetWindowThreadProcessId Lib "user32" (ByVal hWnd As Long, lpdwProcessId As Long) As Long
    Private Declare Function UnhookWindowsHookEx Lib "user32" (ByVal hHook As Long) As Long
    Private Declare Function UnhookWinEvent Lib "user32.dll" (ByVal hWinEventHook As Long) As Long
#End If
 

Discussions similaires

Les cookies sont requis pour utiliser ce site. Vous devez les accepter pour continuer à utiliser le site. En savoir plus…