一个简单的钩子

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、运行结果

点击“确定”按钮后,按任意键盘,会弹出显示键盘名称的对话框

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值