?
Also ich hab mir jetzt eine DLL erstellt um einen systemweiten Tastaturhook zu erstellen. Testweise logge ich die Tastatureingabe in einer Datei mit. Dieses mitloggen funktioniert von jeder Anwendung heraus. Das ist aber nicht Zweck des Hooks, er soll lediglich eine Nachricht an mein Hauptprogramm schicken um diesem Mitteilen, dass eine Eingabe erfolgte. Meine Hookproceduren sehen wie folgt aus.
Also das hier geht:
LRESULT __declspec(dllexport)__stdcall CALLBACK Hook_KeyboardProc(int nCode, WPARAM wParam, LPARAM lParam){
if(((DWORD)lParam & 0x40000000) && (nCode == HC_ACTION)){
if((wParam >= VK_LBUTTON) && (wParam < 0x100)){
char text[16];
sprintf(text, "0x%02X\r\n", wParam);
Hook_SaveBinaryFile("D:\\test.txt", text, "ab+", strlen(text)); //Funktion schreibt Code des Zeichens in eine Datei
}
}
return CallNextHookEx(hHook, nCode, wParam, lParam);
}
das hier nur bedingt
#define WM_KEYSTROKEDETECTED (WM_USER +1)
LRESULT __declspec(dllexport)__stdcall CALLBACK Hook_KeyboardProc(int nCode, WPARAM wParam, LPARAM lParam){
if(((DWORD)lParam & 0x40000000) && (nCode == HC_ACTION)){
if((wParam >= VK_LBUTTON) && (wParam < 0x100)){
PostMessage(hDlgMain, WM_KEYSTROKEDETECTED, 0, 0); //geht nicht
//oder
SendMessage(hDlgMain, WM_KEYSTROKEDETECTED,0, 0); //geht auch nicht
}
}
return CallNextHookEx(hHook, nCode, wParam, lParam);
}
Also mein Hauptprogramm bekommt die Messages nur wenn es auch das aktive Fenster ist. hDlgMain hab ich beim Start des Hooks so Initialisiert
#pragma data_seg(".SHARDAT")
static HHOOK hHook = NULL;
#pragma data_seg()
HWND hDlgMain;
HINSTANCE hInstance;
#pragma comment(linker, "/section:.SHARDAT,RWS")
void __declspec(dllexport)Hook_InitHook(HINSTANCE hInstanceDLL, HWND hWnd){
hInstance = hInstanceDLL;
hDlgMain = hWnd;
}
Meiner Meinung nach stimmt wohl der Handel zu meinem Hauptprogramm hDlgMain nicht immer, kann mir jemand weiterhelfen und sagen wie es richtig gemacht wird.