Windows Mobile 上使用键盘钩子

【IT168 技术文档】
原文地址:http://tech.it168.com/d/2008-01-03/200801031715485.shtml
最近做的项目涉及Wince 按键的Hook操作,需要屏蔽挂机键和一些系统按键。
在Windows中,设置键盘钩子很多人都做过,但是在windows Mobile系统中并没有直接的函数支持。但是我们可以通过使用undocument api来实现。
首先定义一些参数

#define WH_KEYBOARD_LL           20
#define HC_ACTION      0


typedef LRESULT    (CALLBACK
* HOOKPROC)(int  code, WPARAM wParam, LPARAM lParam);
typedef HHOOK         (WINAPI 
*_SetWindowsHookExW)(int
, HOOKPROC, HINSTANCE, DWORD);
typedef LRESULT    (WINAPI 
*_CallNextHookEx)(HHOOK, int
, WPARAM, LPARAM);
typedef LRESULT    (WINAPI 
*
_UnhookWindowsHookEx)(HHOOK);

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

static _SetWindowsHookExW         SetWindowsHookEx;
static _UnhookWindowsHookEx    UnhookWindowsHookEx;
static _CallNextHookEx          CallNextHookEx;   

然后是实现的代码,LLKeyboardHookCallbackFunction就是回调函数

BOOL ActivateKBHook(HINSTANCE hInstance, HOOKPROC LLKeyboardHookCallbackFunction)

    
//
we need to manually load these standard Win32 API calls
    
//MSDN states that these aren't supported in WinCE


    SetWindowsHookEx        
= NULL;
    CallNextHookEx            
=
 NULL;
    UnhookWindowsHookEx        
=
 NULL;

       //从
coredll.dll 获取我们需要的函数

    g_hHookApiDLL = LoadLibrary(_T("coredll.dll"));
    
if(g_hHookApiDLL ==
 NULL) 
    
{
        
return FALSE;
    }

    
else
    
{

        SetWindowsHookEx = (_SetWindowsHookExW)GetProcAddress(g_hHookApiDLL, _T("SetWindowsHookExW"));
        
if(SetWindowsHookEx ==
 NULL)
        
{
            
           

            return
FALSE;
        }

        
else
        
{
           

            g_hInstalledLLKBDhook = SetWindowsHookEx(WH_KEYBOARD_LL, LLKeyboardHookCallbackFunction, hInstance, 0);
            
if(g_hInstalledLLKBDhook ==
 NULL)
            
{
                
                
return
FALSE;
            }

        }

        
      

        CallNextHookEx = (_CallNextHookEx)GetProcAddress(g_hHookApiDLL, _T("CallNextHookEx"));
        
if(CallNextHookEx ==
 NULL)
        
{
        
            
return
FALSE;
        }


     

        UnhookWindowsHookEx = (_UnhookWindowsHookEx)GetProcAddress(g_hHookApiDLL, _T("UnhookWindowsHookEx"));
        
if(UnhookWindowsHookEx ==
 NULL) 
        
{
            
return
FALSE;
        }

    }


 

    return TRUE;
}



BOOL DeactivateKBHook()
{
    
//unload the hook

    if(g_hInstalledLLKBDhook != NULL)
    
{
        UnhookWindowsHookEx(g_hInstalledLLKBDhook);
        g_hInstalledLLKBDhook 
=
 NULL;
    }


    
//unload the coredll.dll
    if(g_hHookApiDLL != NULL)
    
{
        FreeLibrary(g_hHookApiDLL);
        g_hHookApiDLL 
=
 NULL;
    }

    
    
//we have terminated gracefully
    return TRUE;
}



一般的回调函数是这么写的,BlockKeyList是需要屏蔽的按键列表
int CLoginDlg::BlockKeyList[] = {VK_TBACK,VK_TTALK,VK_TEND,VK_THOME};


LRESULT CALLBACK CLoginDlg::LLKeyboardHookCallbackFunction(int  nCode, WPARAM wParam, LPARAM lParam) 
{
    
if(nCode >=
 HC_ACTION)
    
{
        
if(wParam == WM_KEYDOWN || wParam == WM_KEYUP || wParam ==
 WM_LBUTTONDOWN)  
        

           


            
int countKeyList = ARRAY_SIZEOF(BlockKeyList);

            
for(int i=0;i<countKeyList;i++
)
            
{
                
if((((KBDLLHOOKSTRUCT*)lParam)->vkCode) ==
 BlockKeyList[i])
                
{
                    
return TRUE;
                }

            }


    

        }

    }


    
return CallNextHookEx(g_hInstalledLLKBDhook, nCode, wParam, lParam);
}

最后还有关键的一点,网上有人说WH_KEYBOARD_LL不需要用DLL就能实现全局钩子,但是我发觉至少在windows mobile的机器上不行,还是要用DLL来实现键盘钩子。

以上的方法在windows mobile 5.0以及6.0上都可以正常使用,如果你只是要屏蔽所有按键的话可以简单的使用
EnableHardwareKeyboard函数来实现。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值