Pour l'un de mes projets, j'ai besoin de créer une fonction qui retourne un handle à une fenêtre lorsque l'utilisateur clique dessus (n'importe quelle fenêtre affichée à l'écran, et n'importe où dans cette fenêtre). Je sais qu'il est possible d'utiliser un hook global, mais je pense qu'il doit y avoir une façon plus simple de le faire, sans utiliser aucune injection de DLL. En fait, je pourrais intercepter le clic gauche de la souris ou intercepter quand une fenêtre est activée. Puis-je utiliser l'une de ces deux solutions sans injection de DLL?Comment retourner le handle d'une fenêtre quand on clique dessus, sans injection de DLL?
Répondre
Vous pouvez utiliser un crochet LowLevelMouseProc pour intercepter le clic, puis utiliser WindowFromPoint pour déterminer la fenêtre. (Je n'ai pas réellement essayé ceci.)
Appelez SetCapture
. Lorsque vous faites cela, tous les événements de souris suivants iront à votre propre fenêtre. Lorsque vous obtenez un événement click, appelez ReleaseCapture
, puis WindowFromPoint
pour savoir quelle fenêtre se trouve au point où vous avez reçu l'événement click. Les coordonnées que vous obtenez dans l'événement click seront relatives à la fenêtre que vous avez passée à SetCapture
, pour ne pas oublier de les convertir en coordonnées d'écran en premier. Utilisez ClientToScreen
.
C'est une façon un peu plus compliquée de le faire, mais c'est une technique intéressante, merci beaucoup :) –
Plus compliqué que quoi? Un crochet de souris? Pour qu'un hook de souris intercepte des messages liés à un autre processus, la procédure de hook doit être dans une DLL. SetCapture fonctionne sans avoir besoin d'un module séparé. –
@DooDee: si vous voulez un comportement "modal" (où l'utilisateur sélectionne une fenêtre) alors essayez la solution de Rob; si ce n'est pas modal (et que vous voulez que le clic fonctionne normalement), essayez le crochet que j'ai mentionné ci-dessus. – jdigital
Merci beaucoup, en théorie, ça pourrait faire l'affaire! Je vais essayer de vous le faire savoir;) A bientôt! –
Donc, j'ai essayé votre solution et cela fonctionne comme un charme, et sans aucune DLL! Merci beaucoup! –