第九章 keyhookdll windows程序设计王艳平版

本文深入探讨了Windows Hook技术的应用,重点介绍了如何利用Hook API在不同进程中实现消息传递,包括自定义消息定义、钩子函数实现及共享数据管理。详细解释了SetKeyHook函数的使用方法,并提供了关键代码片段。通过实例分析,读者能够理解Windows Hook在复杂应用中的高效集成与扩展能力。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

///////////////////////////////////////////
// KeyHookLib.h文件


// 定义函数修饰宏,方便引用本DLL工程的导出函数
#ifdef KEYHOOKLIB_EXPORTS
#define KEYHOOKLIB_API __declspec(dllexport)
#else
#define KEYHOOKLIB_API __declspec(dllimport)
#endif


// 自定义与主程序通信的消息
#define HM_KEY WM_USER + 101


// 声明要导出的函数
BOOL KEYHOOKLIB_API WINAPI SetKeyHook(BOOL bInstall, 

     DWORD dwThreadId = 0, HWND hWndCaller = NULL);


EXPORTS
   SetKeyHook




SECTIONS
YCIShared   Read Write Shared


////////////////////////////////////////////////
// KeyHookLib.cpp文件


#include <windows.h>


#define KEYHOOKLIB_EXPORTS
#include "KeyHookLib.h"




// 共享数据段
#pragma data_seg("YCIShared")
HWND g_hWndCaller = NULL; // 保存主窗口句柄
HHOOK g_hHook = NULL; // 保存钩子句柄
#pragma data_seg()


// 一个通过内存地址取得模块句柄的帮助函数
HMODULE WINAPI ModuleFromAddress(PVOID pv) 
{
MEMORY_BASIC_INFORMATION mbi;
if(::VirtualQuery(pv, &mbi, sizeof(mbi)) != 0)
{
return (HMODULE)mbi.AllocationBase;
}
else
{
return NULL;
}
}


// 键盘钩子函数
LRESULT CALLBACK KeyHookProc(int nCode, WPARAM wParam, LPARAM lParam)
{
        if(nCode < 0 || nCode == HC_NOREMOVE)
return ::CallNextHookEx(g_hHook, nCode, wParam, lParam);

        if(lParam & 0x40000000) // 消息重复就交给下一个hook链
{
return ::CallNextHookEx(g_hHook, nCode, wParam, lParam);
}

// 通知主窗口。wParam参数为虚拟键码, lParam参数包含了此键的信息
        ::PostMessage(g_hWndCaller, HM_KEY, wParam, lParam);

        return ::CallNextHookEx(g_hHook, nCode, wParam, lParam);
}


// 安装、卸载钩子的函数
BOOL WINAPI SetKeyHook(BOOL bInstall, DWORD dwThreadId, HWND hWndCaller)
{
BOOL bOk;
g_hWndCaller = hWndCaller;

if(bInstall)
{
g_hHook = ::SetWindowsHookEx(WH_KEYBOARD, KeyHookProc, 
ModuleFromAddress(KeyHookProc), dwThreadId);
bOk = (g_hHook != NULL);

else 
{
bOk = ::UnhookWindowsHookEx(g_hHook);
g_hHook = NULL;
}

return bOk;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值