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.
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.
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:
Post a Comment