Mám toto:
// keyboard hook
HHOOK hook;
KBDLLHOOKSTRUCT kbdStruct;
LRESULT __stdcall HookCallback(int nCode, WPARAM wParam, LPARAM lParam);
LRESULT __stdcall HookCallback(int nCode, WPARAM wParam, LPARAM lParam)
{
if (nCode >= 0){
// the action is valid: HC_ACTION.
if (wParam == WM_KEYDOWN){
// lParam is the pointer to the struct containing the data needed, so cast and assign it to kdbStruct.
kbdStruct = *((KBDLLHOOKSTRUCT*)lParam);
if (kbdStruct.vkCode == VK_F1) // a key (non-system) is pressed.
MessageBox(NULL, "F1 is pressed!", "key pressed", MB_ICONINFORMATION);
}
}
// call the next hook in the hook chain
return CallNextHookEx(hook, nCode, wParam, lParam);
}
void SetHook(){
hook = SetWindowsHookEx(WH_KEYBOARD_LL, HookCallback, NULL, 0);
DWORD dw = GetLastError();
if (!(hook = SetWindowsHookEx(WH_KEYBOARD_LL, HookCallback, NULL, 0)))
MessageBox(NULL, "Failed to install hook!", "Error", MB_ICONERROR);
}
void ReleaseHook()
{
UnhookWindowsHookEx(hook);
}
LRESULT CALLBACK MapWndProc(HWND window, UINT msg, WPARAM wParam, LPARAM lParam)
{
LRESULT ret = 0;
int i;
switch (msg)
{
case WM_CREATE:
ret = 0;
SetHook();
OnWM_Create(window, (CREATESTRUCT*)lParam);
break;
...
}
}
Nejde mi zavést ten hook:
hook = SetWindowsHookEx(WH_KEYBOARD_LL, HookCallback, NULL, 0);
DWORD dw = GetLastError();
chyba 1428
Windows Error 1428 : ERROR_HOOK_NEEDS_HMOD: Cannot set nonlocal hook without a module handle.
Je mi jasné, že tam mám načíst nějaký module, knihovnu, ale nevím jakou a jak. Jak tam dostat ten handle?
Je to převzaté odsud:
http://www.unknowncheats.me/forum/c-and-c/83707-setwindowshookex-example.html
jenže to je verze která pod XP nejede pravděpodobně proto že je tam chybná syntaxe, a podle toho co jsem vyledal na netu tak v C# ve Windows 7 to jede, ale chyba v argumentu 3 a 4 tam je. Hledal jsem jednoduchý příklad pro C++ běžící pod XP a nenašel jsem nic.