Mousehook funktioniert nicht
-
Ich hab versucht einen Mousehook zu erstellen, aber ich bekomm nur Nachrichten wenn die Maus über meinem Fenster ist:
#include <windows.h> #define WM_MOUSEHOOK WM_USER+100 HINSTANCE tInstance; HWND thwnd; HHOOK hook; LRESULT CALLBACK MouseProc(int nCode, WPARAM wParam, LPARAM lParam) { if(nCode >= 0) { SendMessage(thwnd, WM_MOUSEHOOK, wParam, lParam); } return CallNextHookEx(NULL, nCode, wParam, lParam); } extern "C" _declspec(dllexport) void _stdcall SetHook(HWND hwnd) { thwnd = hwnd; hook = SetWindowsHookEx(WH_MOUSE, MouseProc, tInstance, NULL); } extern "C" _declspec(dllexport) void _stdcall UnSetHook() { UnhookWindowsHookEx(hook); } BOOL WINAPI DllMain (HINSTANCE hInst, DWORD reason, LPVOID reserved) { tInstance = hInst; return TRUE; }extern "C" _declspec(dllimport) void _stdcall SetHook(HWND list); extern "C" _declspec(dllimport) void _stdcall UnSetHook(); #define WM_MOUSEHOOK WM_USER+100 BOOL CALLBACK WndProc(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam) { switch(message) { case WM_INITDIALOG: SetHook(hwnd); return TRUE; //WM_INITDIALOG case WM_CLOSE: UnSetHook(); EndDialog(hwnd, 0); return TRUE; //WM_CLOSE case WM_MOUSEHOOK: [...] return TRUE; //WM_MOUSEHOOK } return FALSE; }Woran könnte das liegen?
-
Dass Deine Hook-Funktion in keiner DLL ist?
-
Der obere Code befindet sich in einer DLL
-
In allen anderen Prozessen ist wohl thwnd nicht initialisiert.
-
Du kannst "thwnd" und "hook" in eine "shared" Section packen, dann gibts die Variablen bloss 1x für alle Prozesse die die DLL geladen haben.
-
Am besten ist es, wenn du WH_MOUSE_LL hookst, da dieser Hook immer global ist.
Hier mal ein kleines Beispiel:
#include <stdio.h> #include <windows.h> HHOOK maus; int i=0; __declspec (dllexport) LRESULT CALLBACK mausaktion(int nCode, WPARAM wParam, LPARAM lParam) { if (nCode < 0) return -1; if (nCode == HC_ACTION) { printf("%d: maus aktion\n", i); i++; } return(CallNextHookEx(maus, nCode, wParam, lParam)); } void hook(void) { maus=SetWindowsHookEx(WH_MOUSE_LL,(HOOKPROC)mausaktion,GetModuleHandle(0),0); } void unhook(void) { UnhookWindowsHookEx(maus); } int main(int argc,char *argv[]) { MSG msg; hook(); while (GetMessage(&msg,NULL,0,0)) { TranslateMessage(&msg); DispatchMessage(&msg); } unhook(); return(0); }Alles weitere steht in der MSDN Library:
http://msdn.microsoft.com/library/default.asp?url=/library/en-us/winui/winui/windowsuserinterface/windowing/hooks/hookreference/hookfunctions/mouseproc.asp
http://msdn.microsoft.com/library/default.asp?url=/library/en-us/winui/winui/windowsuserinterface/windowing/hooks/hookreference/hookstructures/msllhookstruct.asp