Windows Mobile 消息钩子(1)

简介:     在Windows中,设置键盘钩子很多人都做过,但是在windows Mobile系统中并没有直接的函数支持。但是我们可以通过使用undocument api来实现。

    在Windows中,设置键盘钩子很多人都做过,但是在windows Mobile系统中并没有直接的函数支持。但是我们可以通过使用undocument api来实现。

一、定义参数

 
  1. #define WH_KEYBOARD_LL           20 
  2. #define HC_ACTION        0 
  3. typedef LRESULT(CALLBACK* HOOKPROC)(int code, WPARAM wParam, LPARAM lParam); 
  4. typedef HHOOK (WINAPI *_SetWindowsHookExW)(int, HOOKPROC, HINSTANCEDWORD); 
  5. typedef LRESULT (WINAPI *_CallNextHookEx)(HHOOKintWPARAMLPARAM); 
  6. typedef LRESULT (WINAPI *_UnhookWindowsHookEx)(HHOOK); 
  7. typedef struct 
  8.     DWORD vkCode; 
  9.     DWORD scanCode; 
  10.     DWORD flags; 
  11.     DWORD time; 
  12.     ULONG_PTR dwExtraInfo; 
  13. } KBDLLHOOKSTRUCT, *PKBDLLHOOKSTRUCT; 
  14.  
  15. static _SetWindowsHookExW       SetWindowsHookEx; 
  16. static _UnhookWindowsHookEx    UnhookWindowsHookEx; 
  17. static _CallNextHookEx                CallNextHookEx;   

二、实现代码

LLKeyboardHookCallbackFunction就是回调函数

 
  1. BOOL ActivateKBHook(HINSTANCE hInstance, 
  2.   HOOKPROC LLKeyboardHookCallbackFunction) 
  3. //we need to manually load these standard Win32 API calls 
  4. //MSDN states that these aren''t supported in WinCE 
  5.     SetWindowsHookEx        = NULL; 
  6.     CallNextHookEx            = NULL; 
  7.     UnhookWindowsHookEx        = NULL; 
  8. //从 coredll.dll 获取我们需要的函数 
  9.     g_hHookApiDLL = LoadLibrary(_T("coredll.dll")); 
  10.     if(g_hHookApiDLL == NULL) 
  11.    { 
  12.         return FALSE; 
  13.     } 
  14.     else 
  15.     { 
  16.         SetWindowsHookEx = (_SetWindowsHookExW)GetProcAddress(
  17. g_hHookApiDLL, _T("SetWindowsHookExW")); 
  18.         if(SetWindowsHookEx == NULL) 
  19.         { 
  20.             return FALSE; 
  21.         } 
  22.         else 
  23.         { 
  24.             g_hInstalledLLKBDhook = SetWindowsHookEx(WH_KEYBOARD_LL,
  25.  LLKeyboardHookCallbackFunction, hInstance, 0); 
  26.             if(g_hInstalledLLKBDhook == NULL) 
  27.             { 
  28.                 return FALSE; 
  29.             } 
  30.         } 
  31.         CallNextHookEx = (_CallNextHookEx)GetProcAddress(g_hHookApiDLL,
  32.  _T("CallNextHookEx")); 
  33.         if(CallNextHookEx == NULL) 
  34.         { 
  35.             return FALSE; 
  36.         } 
  37.         UnhookWindowsHookEx = (_UnhookWindowsHookEx)GetProcAddress(g_hHookApiDLL,
  38.  _T("UnhookWindowsHookEx")); 
  39.         if(UnhookWindowsHookEx == NULL) 
  40.         { 
  41.             return FALSE; 
  42.         } 
  43.     } 
  44.     return TRUE; 
  45.  
  46. BOOL DeactivateKBHook() 
  47.     //unload the hook 
  48.     if(g_hInstalledLLKBDhook != NULL) 
  49.     { 
  50.         UnhookWindowsHookEx(g_hInstalledLLKBDhook); 
  51.         g_hInstalledLLKBDhook = NULL; 
  52.     } 
  53.     //unload the coredll.dll 
  54.     if(g_hHookApiDLL != NULL) 
  55.     { 
  56.         FreeLibrary(g_hHookApiDLL); 
  57.         g_hHookApiDLL = NULL; 
  58.     } 
  59.     //we have terminated gracefully 
  60.     return TRUE; 

三、消息回调函数

一般的回调函数是这么写的,BlockKeyList是需要屏蔽的按键列表

 
  1. int CLoginDlg::BlockKeyList[] = {VK_TBACK,VK_TTALK,VK_TEND,VK_THOME}; 
  2. LRESULT CALLBACK CLoginDlg::LLKeyboardHookCallbackFunction(int nCode,
  3.  WPARAM wParam, LPARAM lParam) 
  4.     if(nCode >= HC_ACTION) 
  5.     { 
  6.         if(wParam == WM_KEYDOWN || wParam == WM_KEYUP
  7.  || wParam == WM_LBUTTONDOWN) 
  8.         {
  9.             int countKeyList = ARRAY_SIZEOF(BlockKeyList);
  10.             for(int i=0;i<countKeyList;i++) 
  11.             {
  12.                 if((((KBDLLHOOKSTRUCT*)lParam)->vkCode) == BlockKeyList[i])
  13.                 {
  14.                     return TRUE; 
  15.                 } 
  16.             } 
  17.         } 
  18.     } 
  19.     return CallNextHookEx(g_hInstalledLLKBDhook, nCode, wParam, lParam); 

   Windows Mobile下不使用DLL也可以实现全局键盘钩子)

   如果你只是要屏蔽所有按键的话可以简单的使用EnableHardwareKeyboard函数来实现。



目录
相关文章
|
存储 Ubuntu Linux
windows 操作系统使用 pscp 拷贝文件到 Linux 系统遇到的错误消息
windows 操作系统使用 pscp 拷贝文件到 Linux 系统遇到的错误消息
195 0
windows 操作系统使用 pscp 拷贝文件到 Linux 系统遇到的错误消息
EMQ
|
缓存 数据可视化 物联网
在 Windows 上搭建 MQTT 消息服务器
本文将以NanoMQ为例,演示如何通过安装包和源代码编译两种安装方式,在Windows系统中快速搭建一个可以支持多协议连接的物联网MQTT消息服务器。
EMQ
452 0
|
SQL 前端开发 Windows
SQL Sever2012安装错误——Windows Installer错误消息:打开安装日志文件的错误的原因及解决方案
由于要对着错误信息来解决,所以此处是用手机拍摄的,如果看不清楚可以看下面的文字版;此处的错误是在安装程序支持规则中爆出的
420 0
SQL Sever2012安装错误——Windows Installer错误消息:打开安装日志文件的错误的原因及解决方案
|
JSON JavaScript 安全
基于Windows微信实现实时收发微信消息App
基于Windows微信实现实时收发微信消息App
1185 0
基于Windows微信实现实时收发微信消息App
|
存储 监控 算法
微信Windows端IM消息数据库的优化实践:查询慢、体积大、文件损坏等
本文分享的是,微信客户端团队基于对微信用户日常使用场景和数据分析,通过分离重要和非重要数据、采用可靠的分库策略等,对微信Windows端IM本地数据库的架构进行的优化和改造,并最终得到一个具备良好实践效果的技术改造方案。
293 0
微信Windows端IM消息数据库的优化实践:查询慢、体积大、文件损坏等
|
Windows
Windows程序设计——窗口键盘消息滚动事件
Windows程序设计——窗口键盘消息滚动事件
240 0
|
Python Windows
Windows下使用python库 curses遇到错误消息的解决方案
Windows下使用python库 curses遇到错误消息的解决方案
220 0
|
Windows 网络协议
Windows Mobile远程控制软件Pocket Controller Pro简介
不仅PPC/WindowsMobile系统可以使用该控制软件,只要是WINCE内核的系统都可以使用,我在WinCE.net 4.2系统测试通过,只不过640*480的分辨率,控制速度不是那么理想。
933 0
|
数据格式 XML Windows
Windows Mobile 5.0编程—奥运场馆速查
我忙里偷闲,用VS2005开发了一个关于奥运场馆的小程序,时值2008北京奥运前夕,也算是为奥运做了“贡献”
666 0