Systemweiter Hook - Fehlermeldung
-
Da CAPS- und WIN-Tasten manchmal etwas stören, wollte ich mir ein Programm schreiben, das sich im Tray befindet und über welches sich beide Tasten jederzeit per systemweitem Hook sperren und wieder freigeben lassen (auch wenns so etwas schon gibt - ich möchte das trotzdem selber machen :p). Das Programm funktioniert soweit gut, nur erscheint nach dem Aktivieren und Deaktivieren des Hooks eine Exception, die das Schreiben an eine ungültige Adresse bemängelt. Mit dem Debugger konnte ich die Ursache nicht finden, außerdem funktioniert das Programm ja auch, nur erscheint eben jedesmal diese Fehlermeldung.
Ich hoffe immer noch, daß ich nur eine Kleinigkeit übersehen habe. Vielleicht könnt ihr mir helfen?Hier einige Auszüge aus dem Code (am Rest kann es wohl nicht liegen, da ich, wenn ich das Programm auf folgendes Minimum reduzierte, das gleiche Problem hatte):
DLLMain.hpp/.cpp
// HPP-File typedef struct { HHOOK hHook; bool blockWIN; bool blockCAPS; } HookDLLData; typedef void (*SetDataPrototype) (HookDLLData*); // CPP-File HookDLLData dlldata; ... extern "C" void DLL_EXPORT CALLBACK SetData (HookDLLData* data) { dlldata = *data; } extern "C" LRESULT DLL_EXPORT CALLBACK LLKeyboardProc (int nCode, WPARAM wParam, LPARAM lParam) { PKBDLLHOOKSTRUCT p; if (nCode == HC_ACTION) { switch (wParam) { case WM_KEYDOWN: case WM_SYSKEYDOWN: case WM_KEYUP: case WM_SYSKEYUP: p = (PKBDLLHOOKSTRUCT) lParam; if ((((p->vkCode == VK_LWIN) || (p->vkCode == VK_RWIN)) && dlldata.blockWIN) || ((p->vkCode == VK_CAPITAL) && dlldata.blockCAPS)) return (1); } } if (!dlldata.hHook) return (1); return (CallNextHookEx (dlldata.hHook, nCode, wParam, lParam)); }UnitMain.h/.cpp
// Header-File class TFrmMain : public TForm { ... private: // Anwender-Deklarationen ... HOOKPROC hHookProc; HINSTANCE hHookDLL; HookDLLData DLLData; SetDataPrototype DLLSetDataFunc; public: // Anwender-Deklarationen __fastcall TFrmMain(TComponent* Owner); protected: void updateDLLData(void); void hookInstall(void); void hookRelease(void); ... }; // CPP-File void __fastcall TFrmMain::FormCreate(TObject *Sender) { if ((hHookDLL = LoadLibrary ("KeyBlockerDLL.dll")) == NULL) throw (Exception ("Unable to load KeyBlockerDLL.dll")); hHookProc = (HOOKPROC) GetProcAddress (hHookDLL, "LLKeyboardProc"); DLLSetDataFunc = (SetDataPrototype) GetProcAddress (hHookDLL, "SetData"); ... } void __fastcall TFrmMain::FormClose(TObject *Sender, TCloseAction &Action) { ... if (DLLData.hHook) hookRelease (); FreeLibrary (hHookDLL); } void TFrmMain::updateDLLData (void) { if (!DLLSetDataFunc || !DLLData.hHook) return; DLLData.blockWIN = ChkKeyWIN->Checked; DLLData.blockCAPS = ChkKeyCAPS->Checked; DLLSetDataFunc (&DLLData); } void TFrmMain::hookInstall (void) { if (DLLData.hHook) return; DLLData.hHook = SetWindowsHookEx (WH_KEYBOARD_LL, hHookProc, hHookDLL, 0); updateDLLData (); } void TFrmMain::hookRelease (void) { if (!DLLData.hHook) return; UnhookWindowsHookEx (DLLData.hHook); DLLData.hHook = NULL; }