2009-05-09 8 views
0

am en utilisant ceci:fenêtre Accrocher Questions

SetWindowsHookEx(WH_CALLWNDPROC, ...); 

Je peux voir les messages que je veux traiter, mais je veux éviter ces messages d'atteindre la fenêtre cible. J'ai donc essayé ceci:

SetWindowsHookEx(WH_GETMESSAGE, ...); 

Quand je fais ce que je peux modifier le message, et empêcher la fenêtre cible du traitement, mais ce crochet ne voit pas les messages que je dois traiter. Je suppose que c'est parce qu'il est posté dans la file d'attente de la fenêtre cible, pas envoyé? Y a-t-il un moyen de contourner ce problème? J'ai entendu que sous-classer la fenêtre pourrait être en mesure d'accomplir cela, mais puis-je sous-classer une fenêtre dans un processus différent? Y at-il un moyen de le faire en utilisant des crochets?

Répondre

1

Vous ne pouvez pas sous-classer une fenêtre dans un autre processus, mais la DLL hook doit être capable de sous-classer la fenêtre qui vous intéresse. Les hooks WH_GETMESSAGE et WH_CALLWNDPROC s'exécutent dans le contexte du processus qui reçoit le message. ce point vous avez un "in" pour sous-classer la fenêtre de la cible.

0

Vous pouvez essayer subclassing la fenêtre cible, puis filtrer les messages.

+0

Le sous-classement fonctionnera-t-il avec une fenêtre dans un processus différent? –

+0

Je n'ai jamais essayé, mais cela pourrait fonctionner. – Stefan

0

La documentation crochet suggère que ce ne peut pas être fait, mais je suppose que cette stratégie pourrait fonctionner: utilisation SetWindowsHookEx (WH_CALLWNDPROC, ...)

Dans la procédure il suffit de modifier le message que vous voulez jeter un valeur WM_ inutilisée.

LRESULT CALLBACK CallWndProc(int nCode,WPARAM wParam,LPARAM lParam) 
{ 
    CWPSTRUCT *C=(CWPSTRUCT *)lParam; 

    if (...we are interested in this one) { 
    ..deal with this message here... 
    //Modify the message so that the client will ignore it 
    C->message=WM_USER+44; //presumably ignored by client 
    }  
    return GetNextHook(...); 
} 

Nasty mais facile?