1、新建dll
名称为keyboardHook,选择”MFC AppWizard(dll)”,
继续选择”MFC 扩展DLL(使用共享MFC DLL)
2、keyboardHook.cpp
// keyboardHook.cpp : Defines the initialization routines for the DLL.
//
#include "stdafx.h"
#include <afxdllx.h>
#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif
static AFX_EXTENSION_MODULE KeyboardHookDLL = { NULL, NULL };
//两个导出函数
extern "C" __declspec(dllexport) VOID SetHookOn();
extern "C" __declspec(dllexport) VOID SetHookOff();
//钩子函数。系统回调函数,由系统调用,不必自己调用
LRESULT CALLBACK KeyboardProc(int code, WPARAM wParam, LPARAM lParam);
//两个全局变量
#pragma data_seg("mydata")
HHOOK g_Hook = NULL; //钩子句柄
HINSTANCE g_Inst = NULL; //DLL模块句柄
#pragma data_seg()
extern "C" int APIENTRY
DllMain(HINSTANCE hInstance, DWORD dwReason, LPVOID lpReserved)
{
// Remove this if you use lpReserved
UNREFERENCED_PARAMETER(lpReserved);
if (dwReason == DLL_PROCESS_ATTACH)
{
TRACE0("KEYBOARDHOOK.DLL Initializing!\n");
// Extension DLL one-time initialization
if (!AfxInitExtensionModule(KeyboardHookDLL, hInstance))
return 0;
new CDynLinkLibrary(KeyboardHookDLL);
g_Inst = hInstance; //保存DLL模块句柄
}
else if (dwReason == DLL_PROCESS_DETACH)
{
TRACE0("KEYBOARDHOOK.DLL Terminating!\n");
// Terminate the library before destructors are called
AfxTermExtensionModule(KeyboardHookDLL);
}
return 1; // ok
}
//安装钩子
VOID SetHookOn()
{
//WH_KEYBOARD:钩子类型为监视键盘消息;keyboardProc:钩子函数的地址
//g_Inst:钩子函数所在模块的模块句柄;0:表示在所有的线程中挂钩
g_Hook = SetWindowsHookEx(WH_KEYBOARD, KeyboardProc, g_Inst, 0);
}
//卸载钩子
VOID SetHookOff()
{
UnhookWindowsHookEx(g_Hook);
}
//钩子函数
//code:
LRESULT CALLBACK KeyboardProc(int code, WPARAM wParam, LPARAM lParam)
{
if(code < 0) //MSDN要求的
{
//通常情况下,为了消息可以传递到目标窗口,将消息继续传递
return CallNextHookEx(g_Hook, code, wParam, lParam);
}
//HC_ACTION:按键消息,如果为WM_KEYDOWN
if(code == HC_ACTION && lParam > 0)
{
char szBuf[MAXBYTE] = {0};
GetKeyNameText(lParam, szBuf, MAXBYTE); //获得按键对应的文本
MessageBox(NULL, szBuf, NULL, MB_OK);
}
return CallNextHookEx(g_Hook, code, wParam, lParam);
}
3、在keyboardHook.def中添加共享段语句
表示该数据段为全局共享
SECTIONS
mydata READ WRITE SHARED
4、编译,在Debug文件下得到keyboardHook.dll和keyboardHook.lib
5、建立测试DLL的EXE工程
名称为keyboard,选择“MFC AppWizard(exe)”,继续选择“基本对话框”,界面如下:
6、keyboardDlg.cpp
将keyboardHook.dll和keyboardHook.lib复制到工程目录下,
添加如下代码:
//将lib文件添加到工程中
#pragma comment(lib, "keyboardHook.lib")
//如果用到DLL中导出的函数,需要先进行声明
extern "C" VOID SetHookOn();
extern "C" VOID SetHookOff();
void CKeyboardDlg::OnOK()
{
SetHookOn();
}
void CKeyboardDlg::OnCancel()
{
SetHookOff();
}
7、运行结果
点击“确定”按钮后,按任意键盘,会弹出显示键盘名称的对话框