Разбираюсь с хуками в 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 
задаю, вроде бы, для всей системы. Как сделать правильно?