Wednesday, April 8, 2009

Keyboard Hooking in Windows CE 6.0

If you want to monitor system wide keyboard events from an application, then we need to use keyboard hooking using the SetWindowsHookEx & UnhookWindowsHookEx functions. Since we need a system wide hook, we need to place the callback functions in a DLL.




typedef struct {
DWORD vkCode;
DWORD scanCode;
DWORD flags;
DWORD time;
ULONG_PTR dwExtraInfo;
} KBDLLHOOKSTRUCT, *PKBDLLHOOKSTRUCT;
.....

VOID InitHook ()
{
.....
SetWindowsHookEx(WH_KEYBOARD_LL,hookproc,hinstance,NULL);
.....
}
....
HOOKDLL_API LRESULT CALLBACK hookproc(int ncode,WPARAM wparam,LPARAM lparam)
{
UINT uMsg = 0;
if(ncode>=0)
{
if((lparam & 0x80000000) == 0x00000000)//Check whether key was pressed(not released).
{
switch((((KBDLLHOOKSTRUCT*)lparam)->vkCode))
{
case VK_F1:
RETAILMSG(1,(TEXT("TRAPPED, F1\r\n")));
uMsg = WM_USER+755;
break;

case VK_F2:
RETAILMSG(1,(TEXT("TRAPPED, F2\r\n")));
uMsg = WM_USER+756;
break;

case VK_F3:
RETAILMSG(1,(TEXT("TRAPPED, F3\r\n")));
uMsg = WM_USER+757;
break;

case VK_F4:
RETAILMSG(1,(TEXT("TRAPPED, F4\r\n")));
uMsg = WM_USER+758;
break;
}

}
}
return ( CallNextHookEx(hook,ncode,wparam,lparam) );//pass control to next hook in the hook chain.
}


But in Wince 6.0, these APIs have been removed, but is still present in coredll. Hence, they can be accessed using LoadLibrary and GetProcAddress functions.


N.B: Special Thanks Prathamesh S Kulkarni on his article on keyboard hooking in code project.

0 comments: