Разбираюсь с хуками в Win32.
Сделал тестовую программку, которая выводит в файл информацию по нажатым клавишам.
Работает только, когда ее окошко активно. Хотя устанавливаю хук для всей системы.
Вот код установки\снятия хука:
void PeonEventHandlers::OnWork ()
{
hhookDll = LoadLibrary ("PeonHooks.dll");
if (!hhookDll)
throw std::runtime_error ("Can't load library 'PeonHooks.dll'");
// Find set-hook for share function adress:
void (* pSetHookHandle) (HHOOK);
(FARPROC &) pSetHookHandle = GetProcAddress(hhookDll, "SetHookHandle");
if(!pSetHookHandle)
{
FreeLibrary(hhookDll);
throw std::runtime_error ("Can't GetProcAddress 'SetHookHandle'");
}
// Find hook-function adress:
HOOKPROC pKeybProc = (HOOKPROC) GetProcAddress(hhookDll, "?KeybProc@@YGJHIJ@Z");
if(!pKeybProc)
{
FreeLibrary(hhookDll);
throw std::runtime_error ("Can't GetProcAddress '?KeybProc@@YGJHIJ@Z'");
}
// Setting hook:
hookKeyboard = SetWindowsHookEx (WH_KEYBOARD, pKeybProc, hhookDll, NULL);
if(!hookKeyboard)
{
FreeLibrary(hhookDll);
throw std::runtime_error ("Can't SetWindowsHookEx");
}
(* pSetHookHandle) (hookKeyboard);
}
void PeonEventHandlers::OnStop ()
{
UnhookWindowsHookEx(hookKeyboard);
FreeLibrary(hhookDll);
hhookDll = NULL;
hookKeyboard = NULL;
}
Вот код dll:
WPARAM tempwParam = 0;
// Main:
BOOL APIENTRY DllMain( HANDLE hModule,
DWORD ul_reason_for_call,
LPVOID lpReserved
)
{
return TRUE;
}
// Shared-variables:
#pragma data_seg(".HKT")
HHOOK g_hHookKeyboard = NULL;
#pragma data_seg ()
#pragma comment(linker, "/SECTION:.HKT,RWS")
// ...
extern "C" _declspec(dllexport)
void SetHookHandle(HHOOK hookKeyboard)
{
g_hHookKeyboard = hookKeyboard;
}
// Hook-function:
_declspec(dllexport)
LRESULT CALLBACK KeybProc(int nCode, WPARAM wParam, LPARAM lParam)
{
static std::ofstream out ("out.txt");
if(nCode == HC_ACTION)
{
if (tempwParam != wParam)
out << wParam << " " << (char) wParam << " " << std::endl;
tempwParam = wParam;
}
if(g_hHookKeyboard != NULL)
return CallNextHookEx(g_hHookKeyboard, nCode, wParam, lParam);
else
return 0;
}
Этот код работает, будто хук установлен локально. Хотя параметры SetWindowsHookEx
задаю, вроде бы, для всей системы. Как сделать правильно?