2017-10-03 52 views
1

Im essayant de détecter quand un processus distant reçoit un message de WM_MOVE je peux rescannez la nouvelle position de la fenêtre et changer ma fenêtre en conséquence (Im créant une superposition)Comment détecter une fenêtre obtenir un message WM_MOVE

Je pense que je devrais utiliser une injection DLL mais la documentation de Microsoft est si horrible et incohérent que je ne peux pas comprendre le strict minimum requis pour effectuer l'injection et savoir quand un message WM_MOVE a été envoyé au processus distant

+0

Veuillez décrire plus précisément votre problème et ce que vous voulez réaliser. – tambre

+3

Ne jouez pas avec les détails d'implémentation internes. Utilisez plutôt l'infrastructure standard, à savoir [WinEvents] (https://msdn.microsoft.com/en-us/library/windows/desktop/dd373889.aspx), en surveillant [EVENT_OBJECT_LOCATIONCHANGE] (https://msdn.microsoft.com /en-us/library/windows/desktop/dd318066.aspx) événements. – IInspectable

+0

Que voulez-vous dire par «processus à distance»? – MKR

Répondre

1

Pour la prise en charge de bas niveau, utilisez SetWindowsHookEx avec WH_CALLWNDPROC ou WH_CALLWNDPROCRET. Sur Windows x64, vous devrez écrire une DLL 32 bits, une DLL 64 bits, et avoir un processus 32 bits et un processus 64 bits l'appeler avec chaque DLL respective (parce qu'un processus 32 bits ne peut pas définir un crochet 64 bits et vice versa). Ensuite, vous écrivez un mécanisme IPC de votre DLL injectée à votre processus principal, si nécessaire. Mais assurez-vous de le rendre efficace par rapport à l'utilisation du processeur! Si "Afficher le contenu de la fenêtre en faisant glisser" est activé, il y aura beaucoup de messages WM_MOVE lors du déplacement d'une fenêtre.

Pour une prise en charge de niveau supérieur, utilisez SetWinEventHook avec EVENT_OBJECT_LOCATIONCHANGE et assurez-vous que vous le traitez uniquement pour les fenêtres de niveau supérieur. Ce dernier est habituellement préféré au premier, car il est plus fiable.