前几天因为工作需要用到钩子,而且是全局钩子,用来监视别人的程序键盘消息。需要注意几点
1.如果只需要监视自己的应用程序,在自己程序里设置钩子就行。
2.如果需要监视别人的应用程序,一定要做成DLL形式的全局钩子。
首先我是用VS新建一个DLL 工程。头文件如下
#ifndef __KEYHOOK_H_H
#define __KEYHOOK_H_H#ifdef MY_HOOK_API
#else
#define MY_HOOK_API _declspec(dllimport)
#endif#ifdef __cplusplusextern "C" {#endif MY_HOOK_API     BOOL __stdcall Reg_raw_input(HWND hwnd);//注册输入信息,这个可以不要,因为自己工作的原因需要加上MY_HOOK_API BOOL __stdcall  InstallHook();MY_HOOK_API BOOL __stdcall  UnInstallHook();#ifdef __cplusplus}#endif #endif

.CPP文件

自己使用RegisterRawInputDevices这个函数时有一个小问题卡了很久,用这个RIDEV_INPUTSINK标志时(即窗口不在前台时也台捕捉输入源信息),微软文档明确说明不用指定hwndTarget,试了很多次也不成功。然后直接有DLL用FindWindows找自己需要的句柄传给hwndTarget,还是返回失败,只有设置RIM_INPUT才可以,最后偶尔把上层应用的主窗口GetSafeWind()返回的句柄给hwndTarget时才成功。

BOOL __stdcall Reg_raw_input(HWND hwnd)
{static bool bReg_raw_input = false;if(bReg_raw_input)return FALSE;  RAWINPUTDEVICE dev;memset(&dev, 0, sizeof(dev));dev.usUsagePage = 1;dev.usUsage = 6;dev.dwFlags = RIDEV_INPUTSINK;//dev.dwFlags = RIDEV_INPUTSINK;//RIM_INPUT;//Shejn 2015/7/17 16:34:31 adddev.hwndTarget = hwnd;BOOL bReg = RegisterRawInputDevices(&dev, 1, sizeof(dev));bReg_raw_input = true;return bReg;
};BOOL __stdcall  InstallHook()
{BOOL bRet = 1;UProductCmd cmd;bNewKey = cmd.IsUseKeyNewMap();_hHook_msg1 = SetWindowsHookEx(WH_GETMESSAGE, msg_hook_Proc1,g_hInst, NULL);//GetCurrentThreadId());最后一个参数为0表明监视所有线程而不是本身if (_hHook_msg1 == NULL){bRet = 0;}g_hHook = SetWindowsHookEx(WH_KEYBOARD_LL,//这里使用底层键盘钩子,在键盘动产生作用前就响应,而且底层钩子比消息钩子先响应LowLevelKeyboardProc,g_hInst,NULL);if (g_hHook == NULL){bRet = 0;}return bRet;//return g_hHook == NULL ? FALSE : TRUE;
}BOOL __stdcall  UnInstallHook()
{UnhookWindowsHookEx(_hHook_msg1); return UnhookWindowsHookEx(g_hHook);
}BOOL WINAPI DllMain(IN HINSTANCE hDllHandle,IN DWORD nReason,IN LPVOID Reserved)
{//g_hInst = hDllHandle;//return TRUE;switch (nReason){case DLL_PROCESS_ATTACH:g_hInst=HINSTANCE(hDllHandle);break;case DLL_THREAD_ATTACH:break;case DLL_THREAD_DETACH:break;case DLL_PROCESS_DETACH://UnInstallHook();//这个要注释掉,后来发现如果监视的程序关掉,会直接调用这里,导致全局钩子失效,需要卸载钩子时在上层应用关闭时调用break;}return TRUE;
}

下面这段代码注意,如果是回车和空格互换,比如VK_RETURN变成VK_SPACE,keybd_event(VK_SPACE, 0 0, 0);似乎还会键盘钩子捕获到VK_SPACE,为了保险起见,最好设置一个标志,如果是第二个keybd_event产生,则直接return CallNextHookEx(g_hHook, code, wParam, lParam);  这点还没确认,高手可以去确认下。

DWORD dwIndex = 0;
BYTE g_bFreezeCAVK[2] = {VK_F2, VK_F8};
LRESULT CALLBACK LowLevelKeyboardProc(int code,WPARAM wParam,LPARAM lParam)
{if(code == HC_ACTION){PKBDLLHOOKSTRUCT pStruct = (PKBDLLHOOKSTRUCT)lParam;switch (pStruct->vkCode){case VK_RETURN:   dwIndex = 0;break; case VK_SPACE:dwIndex = 1;break;                                                     default:bWork = FALSE;return CallNextHookEx(g_hHook, code, wParam, lParam);}if (wParam == WM_KEYDOWN){keybd_event(g_bVK[dwIndex], MapVirtualKey(g_bVK[dwIndex], 0), 0, 0);return 1;//CallNextHookEx(g_hHook, code, wParam, lParam);//这里注意返回1是原按键无效,如果是CallNextHookEx则会断续传递还会产生原按键消息}}return CallNextHookEx(g_hHook, code, wParam, lParam);
}
//消息钩子,这段代码可以忽略,根据自己的需要来
LRESULT CALLBACK msg_hook_Proc1(int nCode, WPARAM wParam, LPARAM lParam)
{MSG* pMsg = (MSG*)lParam;if(nCode < 0)return CallNextHookEx(_hHook_msg1, nCode, wParam, lParam);if(pMsg->message == WM_INPUT){HRAWINPUT hInput = (HRAWINPUT)pMsg->lParam;CString strDev_name = get_dev_name(hInput);UProductCmd cmd;CString strMini_kbd_id = cmd.get_setting("keyboard", "MiniKeyboardID", "Vid_04d9&Pid_1603");strMini_kbd_id.MakeLower();strDev_name.MakeLower();int aTest = strDev_name.Find(strMini_kbd_id);if(strDev_name.Find(strMini_kbd_id) >= 0  && bNewKey)//cmd.IsUseKeyNewMap()){_bHid = true;}else{_bHid = false;}//bWork = TRUE;if (bWork){if(_bHid){if (bFreeze){keybd_event(g_bFreezeCAVK[dwIndex], MapVirtualKey(g_bFreezeCAVK[dwIndex], 0), 0, 0);}elsekeybd_event(g_bLiveCAVK[dwIndex], MapVirtualKey(g_bLiveCAVK[dwIndex], 0), 0, 0);//keybd_event(g_bCAVK[dwIndex], MapVirtualKey(g_bCAVK[dwIndex], 0), 0, 0);if (dwIndex == 0){bFreeze = !bFreeze;}      }else{bKeep = TRUE;if (bNewKey){keybd_event(g_bNewVK[dwIndex], MapVirtualKey(g_bNewVK[dwIndex], 0), 0, 0);}else{keybd_event(g_bOldVK[dwIndex], MapVirtualKey(g_bOldVK[dwIndex], 0), 0, 0);}}}bWork = FALSE;}  return CallNextHookEx(_hHook_msg1, nCode, wParam, lParam);
}

设置全局键盘钩子和消息钩子相关推荐

  1. Win64 驱动内核编程-28.枚举消息钩子

    枚举消息钩子 简单粘贴点百度的解释,科普下消息钩子: 钩子是WINDOWS中消息处理机制的一个要点,通过安装各种钩子,应用程序能够设置相应的子例程来监视系统里的消息传递以及在这些消息到达目标窗口程序之 ...

  2. 消息钩子与定时器(VC_Win32)

    目录 消息钩子 定时器 (本章节中例子都是用 VS2005 编译调试的) 消息钩子 [概述][相关函数][编写消息钩子] 概述 钩子过程 操作系统在传递消息时,将我们感兴趣的消息先传递给HOOK过程, ...

  3. 关于Windows消息钩子的理解与测试项目

    前奏 近来一直在自学Windows Hook相关的知识,已经尝试多种注入方式.尤其对消息钩子方式很感兴趣,因为看到Spy++能够截获系统中绝大多数应用的消息流,就很想知道它的工作原理,打算制作属于自己 ...

  4. 安装全局消息钩子实现dll窗体程序注入

    说明{      通过设置全局消息钩子来实现dll注入,然后窗体有相关消息请求的时候就会自动加载注入dll, 然后在入口处做处理就可以了.注入方式简单很多,比代码注入和lsp等注入都简单,就不解释了. ...

  5. windows全局消息钩子的一个BUG

    Windows操作系统全局消息钩子Bug 场景: Process A与Process B是同一个程序的两个实例, 1. 两个进程都设置了WH_CBT消息钩子,钩子的消息处理都在TSVulFw.dat模 ...

  6. VC++钩子使用之全局键盘钩子

    文章目录 钩子简介 使用钩子 生成KeyHook.dll 加载KeyHook.dll 窗体接收两次按键消息的问题 参考 如果想要在Win32窗体程序中实现按键捕获,可以覆写PreTranslateMe ...

  7. 如何让你的程序避开全局键盘钩子的监视

    原文地址:http://blog.okbase.net/BlueSky/archive/3839.html 一直以来有个疑问,就是如果别人在你的电脑上安装了键盘钩子来监视你的键盘按键动作,我的程序怎么 ...

  8. 计算机病毒对消息钩子的利用与对抗

    作 者: dncwbc 时 间: 2011-10-07,23:57:15 链 接: http://bbs.pediy.com/showthread.php?t=141059 一.消息钩子的概念     ...

  9. windows中使用钩子拦截消息

    一.前 言 众所周知,Windows程式的运行是依靠发生的事件来驱动.换句话说,程式不断等待一个消息的发生,然后对这个消息的类型进行判断,再做适当的处理.处理完此次消息后又回到等待状态.从上面对Win ...

  10. 消息钩子使用教程(转)

    基本概念钩子(Hook),是Windows消息处理机制的一个平台,应用程序可以在上面设置子程以监视指定窗口的某种消息,而且所监视的窗口可以是其他进程所创建的.当消息到达后,在目标窗口处理函数之前处理它 ...

最新文章

  1. 苏联最早批量生产的晶体三极管
  2. 5G NR - 总体架构与物理层
  3. linux挂载nfs显示nobady,51CTO博客-专业IT技术博客创作平台-技术成就梦想
  4. MySQL Innodb表导致死锁日志情况分析与归纳
  5. 制作点击文字变颜色_腾讯的动态时间轴PPT火了!制作简单又有逼格,都学起来啊...
  6. Exchange 2007迁移Exchange 2010应该注意的13件事
  7. 如何利用C#编写网页投票器程序 如何使用代理来投票 代理IP来投票
  8. CE下基于Zylonite硬件平台的SD卡驱动开发
  9. 2014 网选 广州赛区 hdu 5023 A Corrupt Mayor's Performance Art
  10. 说说WeakReference弱引用
  11. 追踪广告效果保护用户隐私 —— 隐私集合交集算法可以得兼
  12. java二次雷达编码地址
  13. tcp 裸流 发送 html,ffmpeg 命令学习
  14. 6个工具让网页抓取变得轻而易举
  15. 618|Python购书攻略
  16. 将Spring Boot Web应用部署到Tomcat服务器
  17. 网络安全----数字签名与数字证书
  18. Stata:二元Probit模型
  19. pat乙级1087C语言
  20. pc station v15 博图_PC STATION下载报错-工业支持中心-西门子中国

热门文章

  1. arp表老化时间及其修改
  2. ROS联合Webots之实现趣味机器人巡线刷圈
  3. 计算机统计分析spss试卷,《SPSS计算机统计分析方法》习题A卷.doc
  4. hp打印机装不上服务器系统,winxp系统无法安装HP打印机驱动程序如何解决
  5. 英雄联盟 League of Legends for Mac(LOL美服)
  6. 员工培训与开发实训心得体会_人力资源实训个人总结
  7. LaTex写实验报告
  8. Vivado官网下载
  9. ERStudio8.0 破解版 下载 download
  10. 超级APP势不可挡--20190706