2010-08-24 19 views
0

J'ai fait un crochet de niveau bas de la souris et cela fonctionne bien sauf un problème: le paramètre de la procédure.HookProc param - null

voici mon code: http://pastebin.com/X2198UTb

Mon HookProc situé au milieu du code sous mon commentaire.

Est-ce un problème ou devrait-il être comme ça? si cela devrait être comme ça - comment puis-je savoir quelle fenêtre devrait obtenir le bon clic? /// J'ai ajouté une condition pour activer l'événement - clic droit.

Répondre

1

Votre code est assez déroutant du fait que vous avez déclaré la constante WH_MOUSE pour avoir la valeur 14. WH_MOUSE a effectivement la valeur 7, et 14 est la valeur de WH_MOUSE_LL (et oui je sais que vous avez écrit "bas niveau" dans votre question).

Mais alors vous continuez en utilisant les types associés WH_MOUSE. Plus précisément, la procédure de hook d'un hook WH_MOUSE_LL reçoit une structure MSLLHOOKSTRUCT, pas le MOUSEHOOKSTRUCT que vous utilisez. De même, comme Hans et Tergiver l'ont laissé entendre, vous devriez passer le handle du module de votre propre code, pas User32.dll. Essayez d'utiliser Marshal.GetHINSTANCE (typeof (globalMouse) .Module).

+0

vous avez raison, ça devrait être WH_MOUSE_LL. Si je passe ce que vous avez dit, cela ne fonctionne pas du tout, peut-être que si je vais créer une autre DLL cela fonctionnera, mais User32.dll fonctionne ... puis-je connaître le handle de la fenêtre qui devrait recevoir le message avec la structure que vous avez pointée? (parce que je ne vois pas la propriété 'hwnd') – Ohad

+0

Je vais faire WH_MOUSE (pas LL) en CPP ... J'espère que ça va marcher. – Ohad

+0

Non, les hooks de bas niveau sont appelés avant que le message ne soit publié dans la file d'attente des messages du thread cible. Il n'est pas encore associé à un hwnd spécifique. –

0

Cela ne devrait même pas fonctionner du tout. Si vous essayez la même chose (en utilisant LoadLibrary ("User32") et un identifiant de thread de 0) dans une application native pure, cela ne fonctionnera que pendant un petit moment.

L'utilisation d'un hook global nécessite une DLL native (non C#). C'est beaucoup plus compliqué que cela puisse paraître, surtout si vous voulez qu'il fonctionne sur Windows 64 bits où vous avez besoin d'une DLL d'injection 32 et 64 bits ainsi que des processus d'injection 32 et 64 bits.