130Fermer132
GoldenCrystalLe 08/08/2015 à 01:38
Je pense que c'est pas très difficile d'intercepter les messages Windows d'un autre process, maintenant je me suis toujours basé sur Spy++ les rares fois où j'en ai eu besoin.
(Étape 1: Écrire dans une DLL un WindowProc pour sous-classer une fenêtre, Étape 2: Écrire du code pour injecter la dite DLL dans un process cible, Étape 3: Profit)
(Je ne précise bien sûr pas que le plus difficile dans tout ça, ce soit les fioritures associées et non listées !)

Concrètement, c'est vraiment pas intéressant de vérifier les messages Windows reçus par la fenêtre.
C'est sans doute plus simple d'écrire une fausse boucle de message (mode barbare: on !) et de vérifier ce qui passe dedans. (OutputDebugString)
Étape 1: GetMessage
Étape 2: DispatchMessage (Facultatif ici)
Étape 3 => Étape 1

Folco > Es-tu certain que le winId() retourne un HANDLE valide à l'intérieur du constructeur de ton objet ? Sous certains Framework (ex: .NET), c'est à peu près garanti que non.
Les types sont pas particulièrement étanges en réalité:
BYTE => Un octet
WORD => Mot (de 16 bits)
DWORD => Le double du précédent (donc 32 bits)
QWORD => Le double du précédent (donc 64 bits)
Les autres sont un peu plus mystiques, surtout pour les non initiés, mais c'est plutôt bien documenté: https://msdn.microsoft.com/en-us/library/windows/desktop/aa383751(v=vs.85).aspx (Au passage, je découvre le DWORD32 et le DWORD64 sick)

Concernant le champ message de MSG, effectivement, ça stocke un entier 32 bits là où le message est codé sur 16 bits seulement (Voir WM_USER au passage pour la culture).
Sauf contre-indication (expérimentale), tu n'as pas à te préoccuper de ce détail: C'est soit pour le jour où le système utilisera des Id de message 32 bits, soit pour se réserver la possibilité de "masquer" des messages smile

Maintenant…

Comme le dit Zerosquare, il faut vérifier que la fonction RegisterHotKey a bien fonctionné. Si ce n'est pas le cas, GetLastError te donnera le code d'erreur (que tu pourras convertir en texte avec FormatMessage)
Si cela fonctionne bien, il faut vérifier que le message soit bien transmis (tu peux donc coder à l'arrache une boucle de message dans une méthode de ta classe, et mettre un point d'arrêt voir ce qui s'y passe)