//keyHook.c //Copyright (c) 2007-2008 Michael Curran //This file is covered by the GNU General Public Licence //See the file copying.txt for details. #define UNICODE #include #include #include "keyHook.h" keyCallback_t keyDownCallback=(keyCallback_t)NULL; keyCallback_t keyUpCallback=(keyCallback_t)NULL; HINSTANCE moduleHandle; HHOOK keyHookID=0; #pragma comment(linker,"/entry:_DllMainCRTStartup@12") BOOL DllMain(HINSTANCE hModule,DWORD reason,LPVOID lpReserved) { if((reason==DLL_PROCESS_ATTACH)&&(moduleHandle==NULL)) { moduleHandle=hModule; } return TRUE; } LRESULT CALLBACK keyHook(int code, WPARAM wParam, LPARAM lParam) { int vkCode, scanCode, extended, injected; int res; PKBDLLHOOKSTRUCT kbd=(PKBDLLHOOKSTRUCT)lParam; if(code!=HC_ACTION) { return CallNextHookEx(keyHookID,code,wParam,lParam); } vkCode=kbd->vkCode; scanCode=kbd->scanCode; extended=(kbd->flags)&LLKHF_EXTENDED; injected=(kbd->flags)&LLKHF_INJECTED; if(kbd->flags&LLKHF_UP) { res=keyUpCallback(vkCode,scanCode,extended,injected); } else { res=keyDownCallback(vkCode,scanCode,extended,injected); } if(res==TRUE) { return CallNextHookEx(keyHookID,code,wParam,lParam); } else { return 1; } } int initialize(keyCallback_t downCallback, keyCallback_t upCallback) { if(keyHookID) { fprintf(stderr,"Already initialized\n"); return -1; } keyDownCallback=downCallback; keyUpCallback=upCallback; if(!(keyHookID=SetWindowsHookEx(WH_KEYBOARD_LL,(HOOKPROC)keyHook,moduleHandle,0))) { fprintf(stderr,"Error registering key hook\n"); return -1; } return 0; } int terminate() { if(keyHookID) { if(UnhookWindowsHookEx(keyHookID)) { keyHookID=0; return 0; } } return -1; }