您的位置:首页 > 其它

Windows全局钩子dll(键盘)

2013-08-19 18:27 120 查看
// 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;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: