You might want to read remarks to SetWindowsHookEx documentation.
Specifically it says that the thread that installed a global hook should continue to process Windows messages in order to allow both 32-bit and 64-bit applications to run the hook code in the context of the hooking application.
So, I suggest you create a separate thread from DllMain. The thread will install a hook and then run into GetMessage/ProcessMessage loop: http://pastebin.com/JmMvMX78
#include <windows.h>
#include <stdio.h>
HHOOK MouseHook = {0};
HHOOK KeyboardHook = {0};
LRESULT WINAPI MouseHookProc(int Code, WPARAM wParam, LPARAM lParam) {
if (Code == HC_ACTION) {
printf("Mouse\n");
}
return CallNextHookEx(MouseHook, Code, wParam, lParam);
}
LRESULT WINAPI KeyboardHookProc(int Code, WPARAM wParam, LPARAM lParam) {
if (Code == HC_ACTION) {
printf("Keyboard\n");
}
return CallNextHookEx(KeyboardHook, Code, wParam, lParam);
}
DWORD WINAPI ThreadProc(LPVOID param) {
HINSTANCE hInstance = (HINSTANCE)param;
MouseHook = SetWindowsHookEx(WH_MOUSE_LL, MouseHookProc, hInstance, 0);
KeyboardHook = SetWindowsHookEx(WH_KEYBOARD_LL, KeyboardHookProc, hInstance, 0);
MSG message;
while (GetMessage(&message, (HWND)-1, 0, 0) > 0) {
TranslateMessage(&message);
DispatchMessage(&message);
}
UnhookWindowsHookEx(KeyboardHook);
UnhookWindowsHookEx(MouseHook);
return 0;
}
extern "C" __declspec(dllexport) BOOL WINAPI DllMain(HINSTANCE hinstDLL, DWORD fdwReason, LPVOID lpvReserved) {
if (fdwReason == DLL_PROCESS_ATTACH) {
CloseHandle(CreateThread(NULL, 0, ThreadProc, hinstDLL, 0, NULL));
}
return TRUE;
}