利用键盘钩子捕捉linux键盘动作,利用键盘钩子捕获Windows键盘动作[通俗易懂]

利用键盘钩子捕捉linux键盘动作,利用键盘钩子捕获Windows键盘动作[通俗易懂]下载本文示例代码引言  在科研生产中对研制、调试操作的记录是非常有必要而且是有很重要价值的。通过对记录信息的分析,可以在事故发生后准确的分析出事故的起因、操作是否存在失误等许多重要线索。通常需要记录的信息是多种多样的,如环境温度记录、软件运行记录、文件访问记录等等。这里将以键盘信息记录为例来讲述类似的实验信息自动记录的一般实现方法。  由于需要记录当前系统下所有应用程序的键盘录入记录,因此必须采取…

大家好,又见面了,我是你们的朋友全栈君。

下载本文示例代码

引言  在科研生产中对研制、调试操作的记录是非常有必要而且是有很重要价值的。通过对记录信息的分析,可以在事故发生后准确的分析出事故的起因、操作是否存在失误等许多重要线索。通常需要记录的信息是多种多样的,如环境温度记录、软件运行记录、文件访问记录等等。这里将以键盘信息记录为例来讲述类似的实验信息自动记录的一般实现方法。  由于需要记录当前系统下所有应用程序的键盘录入记录,因此必须采取某种特殊的技术来实现本进程(监视程序)对外部进程键盘操作信息的获取。这种技术便是本文将要论述的核心–系统全局钩子。本文下面将对Win32平台下全局钩子的运行机制进行介绍并给出了一个具体的由VC 6.0编写的捕获键盘动作的键盘钩子示例程序。   系统钩子和DLL  钩子的本质是一段用以处理系统消息的程序,通过系统调用,将其挂入系统。钩子的种类有很多,每种钩子可以截获并处理相应的消息,每当特定的消息发出,在到达目的窗口之前,钩子程序先行截获该消息、得到对此消息的控制权。此时在钩子函数中就可以对截获的消息进行加工处理,甚至可以强制结束消息的传递。  在本程序中我们需要捕获在任意窗口上的键盘输入,这就需要采用全局钩子以便拦截整个系统的消息,而全局钩子函数必须以DLL(动态连接库)为载体进行封装,VC6中有三种形式的MFC DLL可供选择,即Regular statically linked to MFC DLL(标准静态链接MFC DLL)、Regular using the shared MFC DLL(标准动态链接MFC DLL)以及Extension MFC DLL(扩展MFC DLL)。 在本程序中为方便起见采用了标准静态连接MFC DLL。  键盘钩子程序示例  本示例程序用到全局钩子函数,程序分两部分:可执行程序KeyKook和动态连接库LaunchDLL。首先创建一个MFC AppWizard(DLL)工程,并选择Regular statically linked to MFC DLL(标准静态链接MFC DLL)选项,以建立MFC扩展动态连接库LaunchDLL.dll。之后,在相应的头文件中添加宏定义和待导出函数的声明:

#define DllExport __declspec(dllexport)……DllExport void WINAPI InstallLaunchEv();……class CLaunchDLLApp : public CWinApp{ public:  CLaunchDLLApp();  //{
{AFX_VIRTUAL(CLaunchDLLApp)  //}}AFX_VIRTUAL  //{
{AFX_MSG(CLaunchDLLApp)  // NOTE – the ClassWizard will add and remove member functions here.  // DO NOT EDIT what you see in these blocks of generated code !  //}}AFX_MSG DECLARE_MESSAGE_MAP()};  同时在实现文件中添加全局变量Hook和全局函数LauncherHook()、SaveLog():

HHOOK Hook;LRESULT CALLBACK LauncherHook(int nCode,WPARAM wParam,LPARAM lParam);void SaveLog(char* c);  最后,完成以上提到的这几个函数的具体编码实现:

CLaunchDLLApp theApp;……DllExport void WINAPI InstallLaunchEv(){ Hook=(HHOOK)SetWindowsHookEx(WH_KEYBOARD,(HOOKPROC)LauncherHook,theApp.m_hInstance,0);}  在此我们实现了Windows的系统钩子的安装,首先要调用SDK中的API函数SetWindowsHookEx()来安装这个钩子函数,其原型是:

HHOOK SetWindowsHookEx(int idHook,HOOKPROC lpfn,HINSTANCE hMod,DWORD dwThreadId);  其中,第一个参数指定钩子的类型,常用的有WH_MOUSE、WH_KEYBOARD、WH_GETMESSAGE等,在此我们只关心键盘操作所以设定为WH_KEYBOARD;第二个参数标识钩子函数的入口地址,当钩子钩到任何消息后便调用这个函数,即当不管系统的哪个窗口有键盘输入马上会引起LauncherHook的动作;第三个参数是钩子函数所在模块的句柄,我们可以很简单的设定其为本应用程序的实例句柄;最后一个参数是钩子相关函数的ID用以指定想让钩子去钩哪个线程,为0时则拦截整个系统的消息,在本程序中钩子需要为全局钩子,故设定为0。

LRESULT CALLBACK LauncherHook(int nCode,WPARAM wParam,LPARAM lParam){ LRESULT Result=CallNextHookEx(Hook,nCode,wParam,lParam); if(nCode==HC_ACTION) {  if(lParam & 0x80000000)  {   char c[1];   c[0]=wParam;   SaveLog(c);  } } return Result;}  虽然调用CallNextHookEx()是可选的,但调用此函数的习惯是很值得推荐的;否则的话,其他安装了钩子的应用程序将不会接收到钩子的通知而且还有可能产生不正确的结果,所以我们应尽量调用该函数除非绝对需要阻止其他程序获取通知。

void SaveLog(char* c){ CTime tm=CTime::GetCurrentTime(); CString name; name.Format(“c:\\Key_%d_%d.log”,tm.GetMonth(),tm.GetDay()); CFile file; if(!file.Open(name,CFile::modeReadWrite)) {  file.Open(name,CFile::modeCreate|CFile::modeReadWrite); } file.SeekToEnd(); file.Write(c,1); file.Close();}  当有键弹起的时候就通过此函数将刚弹起的键保存到记录文件中从而实现对键盘进行监控记录的目的。编译完成便可得到运行时所需的键盘钩子的动态连接库和进行静态链接时用到的lib库。  下面开始编写调用此动态连接库的主程序,并实现最后的集成。另外创建一个单文档应用程序,把所需的动态链接库头文件、lib库复制到工程目录中,将动态链接库复制到Debug目录下。然后链接DLL库:在”Project”,”Settings…”的”Link”属性页内,在”Object/librarymodules:”中填入”LaunchDLL.lib”。再通过”Project”,”Add To Project”,”Files…”将LaunchDLL.h添加到工程中来,最后在视类的源文件KeyHook.cpp中加入对其的引用:

#include “LaunchDLL.h”  这样我们就可以象使用本工程内的 函数一样使用动态连接库LaunchDLL.dll中的所有导出函数了。接下来在视类重载虚函数OnInitialUpdate(),并添加代码完成对键盘钩子的安装:

InstallLaunchEv();  到此为止其实已经完成了所有的功能,但由于本程序是作为一个后台监控软件运行,因此还应当采取其他措施以隐藏其程序界面。这只需在应用程序类CkeyHookApp的InitInstance()函数中将m_pMainWnd->ShowWindow(SW_SHOW)改为m_pMainWnd->ShowWindow(SW_HIDE)即可。  小结  编译运行程序,运行起来之后并无什么现象,但通过Alt Ctrl Del在关闭程序对话框内可以找到我们刚编写完毕的程序”KeyHook”,随便在什么程序中通过键盘输入字符,然后打开记录文件,我们会发现:通过键盘钩子,我们刚才输入的字符都被记录到记录文件中了。系统钩子具有相当强大的功能,通过这种技术可以对几乎所有的Windows系统消息进行拦截、监视、处理。这种技术广泛应用于各种自动监控系统中。本文所述程序在Windows 2000 Professional SP4下由Microsoft Visual C 6.0编译调试通过。

引言  在科研生产中对研制、调试操作的记录是非常有必要而且是有很重要价值的。通过对记录信息的分析,可以在事故发生后准确的分析出事故的起因、操作是否存在失误等许多重要线索。通常需要记录的信息是多种多样的,如环境温度记录、软件运行记录、文件访问记录等等。这里将以键盘信息记录为例来讲述类似的实验信息自动记录的一般实现方法。  由于需要记录当前系统下所有应用程序的键盘录入记录,因此必须采取某种特殊的技术来实现本进程(监视程序)对外部进程键盘操作信息的获取。这种技术便是本文将要论述的核心–系统全局钩子。本文下面将对Win32平台下全局钩子的运行机制进行介绍并给出了一个具体的由VC 6.0编写的捕获键盘动作的键盘钩子示例程序。   系统钩子和DLL  钩子的本质是一段用以处理系统消息的程序,通过系统调用,将其挂入系统。钩子的种类有很多,每种钩子可以截获并处理相应的消息,每当特定的消息发出,在到达目的窗口之前,钩子程序先行截获该消息、得到对此消息的控制权。此时在钩子函数中就可以对截获的消息进行加工处理,甚至可以强制结束消息的传递。  在本程序中我们需要捕获在任意窗口上的键盘输入,这就需要采用全局钩子以便拦截整个系统的消息,而全局钩子函数必须以DLL(动态连接库)为载体进行封装,VC6中有三种形式的MFC DLL可供选择,即Regular statically linked to MFC DLL(标准静态链接MFC DLL)、Regular using the shared MFC DLL(标准动态链接MFC DLL)以及Extension MFC DLL(扩展MFC DLL)。 在本程序中为方便起见采用了标准静态连接MFC DLL。  键盘钩子程序示例  本示例程序用到全局钩子函数,程序分两部分:可执行程序KeyKook和动态连接库LaunchDLL。首先创建一个MFC AppWizard(DLL)工程,并选择Regular statically linked to MFC DLL(标准静态链接MFC DLL)选项,以建立MFC扩展动态连接库LaunchDLL.dll。之后,在相应的头文件中添加宏定义和待导出函数的声明:

#define DllExport __declspec(dllexport)……DllExport void WINAPI InstallLaunchEv();……class CLaunchDLLApp : public CWinApp{ public:  CLaunchDLLApp();  //{
{AFX_VIRTUAL(CLaunchDLLApp)  //}}AFX_VIRTUAL  //{
{AFX_MSG(CLaunchDLLApp)  // NOTE – the ClassWizard will add and remove member functions here.  // DO NOT EDIT what you see in these blocks of generated code !  //}}AFX_MSG DECLARE_MESSAGE_MAP()};  同时在实现文件中添加全局变量Hook和全局函数LauncherHook()、SaveLog():

HHOOK Hook;LRESULT CALLBACK LauncherHook(int nCode,WPARAM wParam,LPARAM lParam);void SaveLog(char* c);  最后,完成以上提到的这几个函数的具体编码实现:

CLaunchDLLApp theApp;……DllExport void WINAPI InstallLaunchEv(){ Hook=(HHOOK)SetWindowsHookEx(WH_KEYBOARD,(HOOKPROC)LauncherHook,theApp.m_hInstance,0);}  在此我们实现了Windows的系统钩子的安装,首先要调用SDK中的API函数SetWindowsHookEx()来安装这个钩子函数,其原型是:

HHOOK SetWindowsHookEx(int idHook,HOOKPROC lpfn,HINSTANCE hMod,DWORD dwThreadId);  其中,第一个参数指定钩子的类型,常用的有WH_MOUSE、WH_KEYBOARD、WH_GETMESSAGE等,在此我们只关心键盘操作所以设定为WH_KEYBOARD;第二个参数标识钩子函数的入口地址,当钩子钩到任何消息后便调用这个函数,即当不管系统的哪个窗口有键盘输入马上会引起LauncherHook的动作;第三个参数是钩子函数所在模块的句柄,我们可以很简单的设定其为本应用程序的实例句柄;最后一个参数是钩子相关函数的ID用以指定想让钩子去钩哪个线程,为0时则拦截整个系统的消息,在本程序中钩子需要为全局钩子,故设定为0。

LRESULT CALLBACK LauncherHook(int nCode,WPARAM wParam,LPARAM lParam){ LRESULT Result=CallNextHookEx(Hook,nCode,wParam,lParam); if(nCode==HC_ACTION) {  if(lParam & 0x80000000)  {   char c[1];   c[0]=wParam;   SaveLog(c);  } } return Result;}  虽然调用CallNextHookEx()是可选的,但调用此函数的习惯是很值得推荐的;否则的话,其他安装了钩子的应用程序将不会接收到钩子的通知而且还有可能产生不正确的结果,所以我们应尽量调用该函数除非绝对需要阻止其他程序获取通知。

void SaveLog(char* c){ CTime tm=CTime::GetCurrentTime(); CString name; name.Format(“c:\\Key_%d_%d.log”,tm.GetMonth(),tm.GetDay()); CFile file; if(!file.Open(name,CFile::modeReadWrite)) {  file.Open(name,CFile::modeCreate|CFile::modeReadWrite); } file.SeekToEnd(); file.Write(c,1); file.Close();}  当有键弹起的时候就通过此函数将刚弹起的键保存到记录文件中从而实现对键盘进行监控记录的目的。编译完成便可得到运行时所需的键盘钩子的动态连接库和进行静态链接时用到的lib库。  下面开始编写调用此动态连接库的主程序,并实现最后的集成。另外创建一个单文档应用程序,把所需的动态链接库头文件、lib库复制到工程目录中,将动态链接库复制到Debug目录下。然后链接DLL库:在”Project”,”Settings…”的”Link”属性页内,在”Object/librarymodules:”中填入”LaunchDLL.lib”。再通过”Project”,”Add To Project”,”Files…”将LaunchDLL.h添加到工程中来,最后在视类的源文件KeyHook.cpp中加入对其的引用:

#include “LaunchDLL.h”  这样我们就可以象使用本工程内的 函数一样使用动态连接库LaunchDLL.dll中的所有导出函数了。接下来在视类重载虚函数OnInitialUpdate(),并添加代码完成对键盘钩子的安装:

InstallLaunchEv();  到此为止其实已经完成了所有的功能,但由于本程序是作为一个后台监控软件运行,因此还应当采取其他措施以隐藏其程序界面。这只需在应用程序类CkeyHookApp的InitInstance()函数中将m_pMainWnd->ShowWindow(SW_SHOW)改为m_pMainWnd->ShowWindow(SW_HIDE)即可。  小结  编译运行程序,运行起来之后并无什么现象,但通过Alt Ctrl Del在关闭程序对话框内可以找到我们刚编写完毕的程序”KeyHook”,随便在什么程序中通过键盘输入字符,然后打开记录文件,我们会发现:通过键盘钩子,我们刚才输入的字符都被记录到记录文件中了。系统钩子具有相当强大的功能,通过这种技术可以对几乎所有的Windows系统消息进行拦截、监视、处理。这种技术广泛应用于各种自动监控系统中。本文所述程序在Windows 2000 Professional SP4下由Microsoft Visual C 6.0编译调试通过。

下载本文示例代码

利用键盘钩子捕获Windows键盘动作利用键盘钩子捕获Windows键盘动作利用键盘钩子捕获Windows键盘动作利用键盘钩子捕获Windows键盘动作利用键盘钩子捕获Windows键盘动作利用键盘钩子捕获Windows键盘动作利用键盘钩子捕获Windows键盘动作利用键盘钩子捕获Windows键盘动作利用键盘钩子捕获Windows键盘动作利用键盘钩子捕获Windows键盘动作利用键盘钩子捕获Windows键盘动作利用键盘钩子捕获Windows键盘动作利用键盘钩子捕获Windows键盘动作利用键盘钩子捕获Windows键盘动作利用键盘钩子捕获Windows键盘动作

阅读(597) | 评论(0) | 转发(0) |

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/134394.html原文链接:https://javaforall.net

(0)
上一篇 2022年5月2日 下午6:00
下一篇 2022年5月2日 下午6:20


相关推荐

  • java输入语句怎么写_java中输入语句是怎么写的「建议收藏」

    java输入语句怎么写_java中输入语句是怎么写的「建议收藏」java中用户输入语句的写法是:1、【Scannersc=newScanner(System.in);】;2、【Stringinput=sc.next();】。(视频教程推荐:java视频)具体代码如下:importjava.util.Scanner;publicclassNumber{/***@paramargs*author:sun*time:2011-05-2…

    2022年7月9日
    30
  • Web 搜索工具

    Web 搜索工具

    2026年3月15日
    1
  • tabnine激活码-激活码分享

    (tabnine激活码)本文适用于JetBrains家族所有ide,包括IntelliJidea,phpstorm,webstorm,pycharm,datagrip等。https://javaforall.net/100143.htmlIntelliJ2021最新激活注册码,破解教程可免费永久激活,亲测有效,上面是详细链接哦~V…

    2022年3月22日
    88
  • 大型企业局域网安全解决方案[通俗易懂]

    大型企业局域网安全解决方案[通俗易懂]第一章总则本方案为某大型局域网网络安全解决方案,包括原有网络系统分析、安全需求分析、安全目标的确立、安全体系结构的设计、等。本安全解决方案的目标是在不影响某大型企业局域网当前业务的前提下,实现对他们局域网全面的安全管理。1.将安全策略、硬件及软件等方法结合起来,构成一个统一的防御系统,有效阻止非法用户进入网络,减少网络的安全风险。2.定期进行漏洞扫描,审计跟踪,及时发现问题,解

    2022年7月15日
    20
  • RedisTemplate操作Redis,这一篇文章就够了(一)[通俗易懂]

    RedisTemplate操作Redis,这一篇文章就够了(一)[通俗易懂]RedisTemplate操作Redis,这一篇文章就够了(一)StringRedisTemplate和RedisTemplate的区别(二)StringRedisTemplate的一个小案例(三)

    2022年6月21日
    39
  • Pycharm专业版激活方法

    Pycharm专业版激活方法方法 一 授权服务器激活 亲测可用 使用 idea 全系列 nbsp 启动 pycharm 以后选择用 activateserv 来激活 地址填 idea qmanga com 或 http xidea online 然后点 activate 亲测最新版 2018 1181 4203 7 方法 二 如果有想了解 pycharm 版本区别的可以找一下这个网址 https www

    2026年3月27日
    2

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号