3249|6

77

帖子

0

TA的资源

一粒金砂(初级)

楼主
 

继续请教wince下的挂钩问题,兄弟们支支招啊~~~~~~~~~~~~~~~ [复制链接]

在wince下利用hook实现记录键盘某个按键的累计按键次数。

我的思路是这样的,写一个叫kbhookdll的dll安装全局钩子,在test2程序中调用。
编译也能通过,但是运行以后整个系统无法响应鼠标和键盘的任何按键了,估计是死机了。

可是在我的钩子过程函数中,根本还没有任何屏蔽操作。

  1. LRESULT CALLBACK LauncherHook(int nCode,WPARAM wParam,LPARAM lParam)
  2. {
  3.    MessageBox(NULL,_T("运行了lanuncherhook函数"),NULL,MB_OK);
  4.    return CallNextHookEx(Hook,nCode,wParam,lParam);
  5. }
复制代码



运行的结果是弹出了"运行了lanuncherhook函数"对话框,但是就死机了。
我把主要的代码传上来,请大家帮帮忙看看好么?


这是dll生成文件部分:

  1. // kbhookdll.cpp : Defines the entry point for the DLL application.
  2. //

  3. #include "stdafx.h"
  4. #include "kbhookdll.h"
  5. #include "winceKBhook.h"
  6. HANDLE hMod;

  7. BOOL APIENTRY DllMain( HANDLE hModule,
  8.                        DWORD  ul_reason_for_call,
  9.                        LPVOID lpReserved
  10.                                          )
  11. {
  12.         hMod=hModule;
  13.     switch (ul_reason_for_call)
  14.         {
  15.                 case DLL_PROCESS_ATTACH:
  16.                 case DLL_THREAD_ATTACH:
  17.                 case DLL_THREAD_DETACH:
  18.                 case DLL_PROCESS_DETACH:
  19.                         break;
  20.     }
  21.     return TRUE;
  22. }


  23. // This is an example of an exported variable
  24. //KBHOOKDLL_API int nKbhookdll=0;

  25. // This is an example of an exported function.
  26. //KBHOOKDLL_API int fnKbhookdll(void)
  27. //{
  28. //        return 42;
  29. //}

  30. // This is the constructor of a class that has been exported.
  31. // see kbhookdll.h for the class definition
  32. CKbhookdll::CKbhookdll()
  33. {
  34.         return;
  35. }

  36. HHOOK Hook;
  37. LRESULT CALLBACK LauncherHook(int nCode,WPARAM wParam,LPARAM lParam);


  38. DllExport void WINAPI InstallLaunchEv()
  39. {
  40.        
  41. /*        Hook=(HHOOK)SetWindowsHookEx(WH_KEYBOARD_LL,
  42.                 (HOOKPROC)LauncherHook,
  43.                 (HINSTANCE)hMod,
  44.                 0);
  45. */
  46.        
  47.         if(!ActivateKBHook((HINSTANCE)hMod, LauncherHook))
  48.         {
  49.                 MessageBox(GetActiveWindow(),
  50.                         TEXT("Couldn't intall hook...Terminating"),
  51.                         TEXT("Warning"), NULL);
  52.                 PostQuitMessage(0);
  53.         }

  54. }







  55. LRESULT CALLBACK LauncherHook(int nCode,WPARAM wParam,LPARAM lParam)
  56. {
  57. //        LRESULT Result=CallNextHookEx(Hook,nCode,wParam,lParam);
  58.        
  59. //if (wParam ==0x43 ) //XX为键盘对应按键
  60. //         {
  61.         //         SendMessage(g_hwnd,WM_USER+1,0,0);
  62. //                 MessageBox(NULL,_T("成功"),NULL,MB_OK);
  63.    
  64. //          }

  65. MessageBox(NULL,_T("运行了lanuncherhook函数"),NULL,MB_OK);
  66.                
  67. //        return Result;
  68. //        return 1;

  69. return CallNextHookEx(Hook,nCode,wParam,lParam);
  70. }
复制代码




运用到的一个文件winceKBhook.cpp
  1. #include "stdafx.h"
  2. #include "winceKBhook.h"
  3. //#include "kbhookdll.h"


  4. //globals
  5. HINSTANCE  g_hHookApiDLL        = NULL;                        //handle to coredll.dll, where all the hook related APIs are present
  6. HHOOK g_hInstalledLLKBDhook = NULL;                        //g_hInstalledLLKBDhook represents handle to the installed KB hook

  7. /**
  8. *        Function Name:ActivateKBHook
  9. *       
  10. *        Function Desc:Initializes the proc. adress of various hook related APIs.
  11. *                                  Loads the keyboard hook.
  12. *
  13. *        Author:                 Prathamesh Kulkarni
  14. **/
  15. WINCEKBHOOK_API BOOL ActivateKBHook(HINSTANCE hInstance, HOOKPROC LLKeyboardHookCallbackFunction)
  16. {
  17.         //we need to manually load these standard Win32 API calls
  18.         //MSDN states that these aren't supported in WinCE
  19.         SetWindowsHookEx                = NULL;
  20.         CallNextHookEx                        = NULL;
  21.         UnhookWindowsHookEx                = NULL;

  22.         //now load the coredll.dll
  23.         g_hHookApiDLL = LoadLibrary(_T("coredll.dll"));
  24.         if(g_hHookApiDLL == NULL)
  25.         {
  26.                 //something is awfully wrong
  27.                 //the dll has to be present
  28.                 MessageBox(NULL,TEXT("can not find coredll.dll"),TEXT("error"),MB_OK);
  29.                 return false;
  30.         }
  31.         else
  32.         {
  33.                 //load the SetWindowsHookEx API call
  34.                 //the SetWindowsHookEx function installs an application-defined hook procedure into a hook chain.
  35.                 //You would install a hook procedure to monitor the system for certain types of events.
  36.                 //here we use use the hook to monitor kyeboard events
  37.                 SetWindowsHookEx = (_SetWindowsHookExW)GetProcAddress(g_hHookApiDLL, _T("SetWindowsHookExW"));
  38.                 if(SetWindowsHookEx == NULL)
  39.                 {
  40.                         //this means that MS has really stopped supporting this API in WinCE
  41.                         MessageBox(NULL,TEXT("can not find SetWindowsHookEx"),TEXT("error"),MB_OK);
  42.                         return false;
  43.                 }
  44.                 else
  45.                 {
  46.                         //install the KB hook
  47.                         //the hande needs to be saved for default processing of the events and to uninstall the hook, once we are done with it
  48.                 g_hInstalledLLKBDhook = SetWindowsHookEx(WH_KEYBOARD_LL, LLKeyboardHookCallbackFunction, hInstance, 0);
  49.         //        g_hInstalledLLKBDhook = SetWindowsHookEx(WH_KEYBOARD_LL, LauncherHook, hInstance, 0);
  50.                         if(g_hInstalledLLKBDhook == NULL)
  51.                         {
  52.                                 MessageBox(NULL,TEXT("set hook error"),TEXT("error"),MB_OK);
  53.                                 return false;
  54.                         }
  55.                         else MessageBox(NULL,TEXT("set hook 成功"),TEXT("error"),MB_OK);//
  56.                 }

  57.                 //load CallNextHookEx() API call
  58.                 //the CallNextHookEx function passes the hook information to the next hook procedure in the current hook chain.
  59.                 //we use this call for default processing of events.
  60.                 CallNextHookEx = (_CallNextHookEx)GetProcAddress(g_hHookApiDLL, _T("CallNextHookEx"));
  61.                 if(CallNextHookEx == NULL)
  62.                 {
  63.                         MessageBox(NULL,TEXT("can not find CallNextHookEx"),TEXT("error"),MB_OK);
  64.                         return false;
  65.                 }

  66.                 //load UnhookWindowsHookEx() API
  67.                 //the UnhookWindowsHookEx function removes a hook procedure installed in a hook chain by the SetWindowsHookEx function.
  68.                 //we use this call to unistall the hook.
  69.                 UnhookWindowsHookEx = (_UnhookWindowsHookEx)GetProcAddress(g_hHookApiDLL, _T("UnhookWindowsHookEx"));
  70.                 if(UnhookWindowsHookEx == NULL)
  71.                 {
  72.                         MessageBox(NULL,TEXT("can not find UnhookWindowsHookEx"),TEXT("error"),MB_OK);
  73.                         return false;
  74.                 }
  75.         }

  76.         //all the APIs are loaded and the application is hooked
  77.         return true;
  78. }

  79. WINCEKBHOOK_API BOOL DeactivateKBHook()
  80. {
  81.         //unload the hook
  82.         if(g_hInstalledLLKBDhook != NULL)
  83.         {
  84.                 UnhookWindowsHookEx(g_hInstalledLLKBDhook);
  85.                 g_hInstalledLLKBDhook = NULL;
  86.         }

  87.         //unload the coredll.dll
  88.         if(g_hHookApiDLL != NULL)
  89.         {
  90.                 FreeLibrary(g_hHookApiDLL);
  91.                 g_hHookApiDLL = NULL;
  92.         }
  93.        
  94.         //we have terminated gracefully
  95.         return true;
  96. }
复制代码




以下是winceKBhook.h
  1. #ifndef _WINCE_KB_HOOK_H
  2. #define _WINCE_KB_HOOK_H

  3. //used for passing to SetWindowsHookEx funtion to set a Low level (LL) keyboard hook
  4. #define WH_KEYBOARD_LL                   20
  5. #define WINCEKBHOOK_API __declspec(dllexport)
  6. #define HC_ACTION           0
  7. #define WH_GETMESSAGE       3
  8. // Define the function types used by hooks
  9. typedef LRESULT        (CALLBACK* HOOKPROC)(int code, WPARAM wParam, LPARAM lParam);
  10. typedef HHOOK                 (WINAPI *_SetWindowsHookExW)(int, HOOKPROC, HINSTANCE, DWORD);
  11. typedef LRESULT        (WINAPI *_CallNextHookEx)(HHOOK, int, WPARAM, LPARAM);
  12. typedef LRESULT        (WINAPI *_UnhookWindowsHookEx)(HHOOK);





  13. // Win32 Hook APIs
  14. static _SetWindowsHookExW                 SetWindowsHookEx;
  15. static _UnhookWindowsHookEx        UnhookWindowsHookEx;
  16. static _CallNextHookEx                  CallNextHookEx;       


  17. WINCEKBHOOK_API BOOL ActivateKBHook(HINSTANCE hInstance, HOOKPROC LLKeyboardHookCallbackFunction);


  18. WINCEKBHOOK_API BOOL DeactivateKBHook();



  19. #endif

复制代码



=============================================================================================================

然后是调用dll文件的对话框程序test2。在OnInitDialog()中调用InstallLaunchEv()挂钩。



此帖出自WindowsCE论坛

最新回复

hook->hook->hook...... 对话框根本收不到键盘或鼠标信息了  详情 回复 发表于 2008-8-18 22:35
点赞 关注
 

回复
举报

75

帖子

0

TA的资源

一粒金砂(初级)

沙发
 
没人来看看吗 5555

试着在这个MessageBox再添加一个MessageBox,但是显示第一个对话框之后就不继续操作了。
此帖出自WindowsCE论坛
 
 
 

回复

66

帖子

0

TA的资源

一粒金砂(初级)

板凳
 
以上无知的说明我收回

再加点说明,如果我把过程函数全部注释掉的话,就不会出现这样的情况。
但是好像程序会自动最小化一次
此帖出自WindowsCE论坛
 
 
 

回复

81

帖子

0

TA的资源

一粒金砂(初级)

4
 
这个codeproject上的例子看过N次了,不过从来没自己做过。
看过很多问键盘hook的,最终都是被人引导到cp这个例子,然后就over了。

第一次看到有人真的在做,还出问题的。没时间细看,先帮顶一下。
此帖出自WindowsCE论坛
 
 
 

回复

55

帖子

0

TA的资源

一粒金砂(初级)

5
 
做的人不少,看的人比较多
所以见到类似的问题都介绍别人去看这个例子,只是实际做事发现好多问题
此帖出自WindowsCE论坛
 
 
 

回复

85

帖子

0

TA的资源

一粒金砂(初级)

6
 
已经解决,类似死机估计是对话框的问题
此帖出自WindowsCE论坛
 
 
 

回复

61

帖子

0

TA的资源

一粒金砂(初级)

7
 
hook->hook->hook......
对话框根本收不到键盘或鼠标信息了
此帖出自WindowsCE论坛
 
 
 

回复
您需要登录后才可以回帖 登录 | 注册

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/10 下一条

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表