一个简单的钩子

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

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

编写系统钩子函数需要使用Windows API来实现,以下是一个简单的示例代码,用于监控键盘输入事件: ``` #include <windows.h> // 声明钩子函数 LRESULT CALLBACK KeyboardProc(int nCode, WPARAM wParam, LPARAM lParam); // 全局变量,保存钩子句柄 HHOOK g_hHook = NULL; int main() { // 创建键盘钩子 g_hHook = SetWindowsHookEx(WH_KEYBOARD_LL, KeyboardProc, NULL, 0); // 消息循环,等待钩子事件 MSG msg; while(GetMessage(&msg, NULL, 0, 0) > 0) { TranslateMessage(&msg); DispatchMessage(&msg); } // 卸载钩子 UnhookWindowsHookEx(g_hHook); return 0; } // 钩子函数 LRESULT CALLBACK KeyboardProc(int nCode, WPARAM wParam, LPARAM lParam) { if(nCode >= 0 && wParam == WM_KEYDOWN) { KBDLLHOOKSTRUCT* pKeyboard = (KBDLLHOOKSTRUCT*)lParam; printf("Key %d pressed\n", pKeyboard->vkCode); } // 将事件传递给下一个钩子 return CallNextHookEx(g_hHook, nCode, wParam, lParam); } ``` 在上面的代码中,我们通过调用`SetWindowsHookEx`函数创建了一个键盘钩子,指定了钩子的类型为`WH_KEYBOARD_LL`,并且指定了钩子函数`KeyboardProc`。在钩子函数中,我们判断键盘事件是否为按键按下事件,并且输出按下的键的虚拟码。最后,我们通过调用`CallNextHookEx`函数将事件传递给下一个钩子。 需要注意的是,在使用钩子函数时需要特别小心,因为钩子函数可能会影响系统的性能和稳定性,如果使用不当可能会导致系统崩溃。因此,在编写钩子函数时需要仔细考虑其实现方式,遵循安全和稳定性的原则。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值