Domanda

Lo sto usando:

SetWindowsHookEx(WH_CALLWNDPROC, ...);

Riesco a vedere i messaggi che voglio elaborare, ma voglio impedire a quei messaggi di raggiungere la finestra di destinazione. Quindi ho provato questo:

SetWindowsHookEx(WH_GETMESSAGE, ...);

Quando lo faccio, posso modificare il messaggio e impedire alla finestra di destinazione di elaborarlo, ma questo hook non vede i messaggi che devo elaborare. Presumo che ciò sia dovuto al fatto che viene pubblicato nella coda della finestra di destinazione, non inviato? C'è un modo per aggirare questo problema? Ho sentito che la sottoclasse delle finestre potrebbe essere in grado di farlo, ma posso sottoclassare una finestra in un processo diverso? C'è un modo per farlo usando gli hook?

È stato utile?

Soluzione

Non puoi sottoclassare una finestra in un altro processo, ma la DLL hook deve essere in grado di sottoclassare la finestra che ti interessa. Gli hook WH_GETMESSAGE e WH_CALLWNDPROC vengono eseguiti nel contesto del processo che riceve il messaggio, quindi punto hai un " in " per sottoclassare la finestra del bersaglio.

Altri suggerimenti

Potresti provare subclassing l'obiettivo finestra e quindi filtrare i messaggi.

La documentazione del hook suggerisce che non è possibile farlo ma presumo che questa strategia potrebbe funzionare: usa SetWindowsHookEx (WH_CALLWNDPROC, ...)

Nella procedura basta modificare il messaggio che si desidera gettare su un valore WM_ inutilizzato.

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(...);
}

Cattivo ma facile?

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top