2010-07-09 5 views
0

J'essaie de définir un hook GetMessage global sur tous les threads. Ceci est ma DLL:Le hook global WH_GETMESSAGE ne fonctionne pas

#include <windows.h> 

__declspec(dllexport) LRESULT CALLBACK GetMsgProc(int nCode, WPARAM wParam, LPARAM lParam) 
{ 
    MessageBeep(0); 

    return CallNextHookEx(NULL, nCode, wParam, lParam); 
} 

Comme vous pouvez le voir, ce n'est pas beaucoup. Je veux juste qu'il appelle MessageBeep quand il est appelé. Mon WinMain charge la bibliothèque, obtient la procédure et définit le hook.

#include <windows.h> 

typedef LRESULT (CALLBACK *LPGetMsgProc)(int nCode, WPARAM wParam, LPARAM lParam); 

int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, PSTR pCmdLine, int nCmdShow) 
{ 
    if(!(HMODULE hDll = LoadLibrary("library.dll"))) 
    return 1; 
    if(!(LPGetMsgProc pfnProc = (LPGetMsgProc)GetProcAddress(hDll, "[email protected]"))) 
    return 2; 

    HHOOK hMsgHook = SetWindowsHookEx(WH_GETMESSAGE, pfnProc, hInstance, 0); 

    MSG msg; 
    while(GetMessage(&msg, NULL, 0, 0) > 0) {} 

    UnhookWindowsHookEx(hMsgHook); 

    return 0; 
} 

Cependant, MessageBeep n'est jamais appelé. Y at-il quelque chose que je fais mal ici?

Aussi, une autre chose m'a dérangé. Dans cet appel:

if(!(LPGetMsgProc pfnProc = (LPGetMsgProc)GetProcAddress(hDll, "[email protected]"))) 

J'ai été obligé d'utiliser « GetMsgProc @ 12 » parce que je ne pouvais pas faire les choses d'une autre façon. Quelqu'un peut-il me dire comment je suis supposé utiliser un fichier .def ou quelque chose d'autre pour que je puisse l'avoir comme "GetMsgProc"? Bien que MSDN a déclaré que depuis que j'ai __declspec (dllexport) dans ma déclaration, je n'en aurais pas besoin ...

Mon IDE est Code :: Blocs avec MinGW. Merci d'avance.

+0

Pour répondre à votre dernière question, vous voulez utiliser 'extern 'C" 'pour empêcher le dénigrement. Je ne suis pas sûr de la première fois encore. avez-vous vérifié que vous recevez des messages? – Shog9

+0

La DLL et l'EXE sont codés et compilés en C, donc je ne peux pas utiliser extern "C". Je pense que je serais en mesure de passer à n'importe quel programme, cliquez n'importe où pour envoyer un message et il appellerait mon GetMsgProc. Cependant, comme MessageBeep n'est pas appelé, ce n'est pas le cas. – kaykun

+0

Eh, je me trompe quand même. Voir: http://stackoverflow.com/questions/366228/def-files-c-c-dlls – Shog9

Répondre

2

Le troisième paramètre ...

HHOOK hMsgHook = SetWindowsHookEx(WH_GETMESSAGE, pfnProc, hInstance, 0); 

... est la poignée passé dans votre fonction WinMain. Mais il doit se référer à la DLL où réside la fonction de rappel - dans votre cas, ce serait hDLL.

Questions connexes