2009-12-21 2 views
0

Je n'ai pas beaucoup d'arrière-plan C++ mais j'ai réussi à accrocher une fenêtre et convertir ses msgs en événements élevés que mon application peut consommer, Ive a hérité de NativeWindow et a remplacé WndProc que je suis intéressé par, WM_VSCROLL et WM_HSCROLL par exemple. Tout d'abord, existe-t-il des implémentations complètes qui soulèvent tous les événements habituels, tels que la touche, le clavier, le clavier, la souris, le mousedown, le vscroll, le hscroll, le vresize, le hresize de la fenêtre. Je suis intéressé à m'assurer que ive a correctement implémenté la classe.Implémentation de Windows hooks en utilisant NativeWindow correctement

Deuxièmement, comment est-ce que je régule correctement les événements produits par ma NativeWindow, afin de limiter le bavardage de l'implémentation.

Répondre

2

Je suppose que vous parlez d'accrocher une fenêtre dans une autre application. C'est un problème non trivial, les arguments wparam et lparam peuvent contenir des pointeurs au lieu de simples valeurs. Ces pointeurs ne sont cependant valables que dans l'espace mémoire virtuel du processus dont la fenêtre est accrochée. Ignorer cela vous achètera une exception AccessViolation.

Vous devez P/Invoke ReadProcessMemory() pour lire la structure pointée vers. Cela doit être fait pour chaque message individuel, vous ne pouvez pas compter sur une implémentation générique. Cela peut devenir très poilu lorsque vous accrochez une fenêtre non triviale comme ListView ou TreeView.

+0

Oui, je veux hooker une autre fenêtre, Appellerait readProcessMemory pour chaque msg causerait un goulot d'étranglement? Je suis un noob dans ce domaine toute aide que vous pourriez fournir serait appréciée. –

+0

RPM est rapide, une microseconde. Peanuts par rapport au coût du commutateur de fil que vous avez maintenant. Vous pouvez seulement le faire d'une manière raisonnablement rapide en injectant une DLL dans le processus. Vous ne pouvez pas faire cela avec du code C#. Google SetWindowsHookEx(). Ce n'est pas noob matériel btw. –

1

La plupart des programmes qui utilisent cette méthode utilisent l'injection de DLL pour gérer les événements à l'intérieur du processus propriétaire de la fenêtre. Bien sûr, vous ne devez pas injecter de code managé dans un autre processus, seulement du code natif qui fait très attention de ne pas gâcher l'état de l'application.

Qu'essayez-vous d'accomplir? Accrocher les fenêtres d'autres applications devrait être le dernier recours.

+0

Je veux accrocher une application comme le bloc-notes et ajouter des fonctionnalités supplémentaires basées sur l'entrée du clavier et de la souris. donc j'ai besoin d'entrer le clavier, la souris, l'entrée de défilement, le texte sélectionné ect. Je ne pense pas qu'il y ait une injection excluant capturer cela et élever des événements à gérer dans mon application. –

Questions connexes