Windows全局钩子dll(键盘)

该博客介绍了如何在Windows环境中实现全局键盘钩子DLL,包括设置和卸载钩子的函数,以及处理键盘事件的回调函数KeyHookProc。通过SetKeyHook函数,可以安装或卸载键盘钩子,并将捕获的键盘事件发送到指定窗口。

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

// dllHookkb.cpp : Defines the entry point for the DLL application.
//
#include "stdafx.h"
#include "dllHookkb.h"

#ifdef _MANAGED
#pragma managed(push, off)
#endif
#pragma data_seg("YCIShared2010")
HWND g_hWndCaller = NULL;
HHOOK g_hHook = NULL;
#pragma data_seg()
BOOL APIENTRY DllMain( HMODULE hModule,
                        DWORD   ul_reason_for_call,
                        LPVOID lpReserved
)
{
switch (ul_reason_for_call)
{
case DLL_PROCESS_ATTACH:
case DLL_THREAD_ATTACH:
case DLL_THREAD_DETACH:
case DLL_PROCESS_DETACH:
break;
}
    return TRUE;
}
#ifdef _MANAGED
#pragma managed(pop)
#endif
// This is an example of an exported variable
DLLHOOKKB_API int ndllHookkb=0;
// This is an example of an exported function.
DLLHOOKKB_API int fndllHookkb(void)
{
return 42;
}
// This is the constructor of a class that has been exported.
// see dllHookkb.h for the class definition
CdllHookkb::CdllHookkb()
{
return;
}
//通过内存地址取得模块句柄的函数
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);
}
//安装,卸载钩子的函数
DLLHOOKKB_API 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、付费专栏及课程。

余额充值