C++ Windows Hook 消息钩子 详解 (六)

2014-11-24 02:34:45 · 作者: · 浏览: 13
ACK KeyboardHookProc(int nCode, WPARAM wParam, LPARAM lParam)
{
if (nCode < 0 || nCode == HC_NOREMOVE)
//向下传递消息使得hook链上的其他函数可以处理该消息
return ::CallNextHookEx(g_hHook, nCode, wParam, lParam);
if (lParam & 0x40000000) // Check the previous key state
{
return ::CallNextHookEx(g_hHook, nCode, wParam, lParam);
}
//将自定义消息发送到主窗口
//wParam 定义了虚拟键代码
//lParam 定义了按键数据
::PostMessage(g_hWnd, WM_KEYSTROKE, wParam, lParam);

return ::CallNextHookEx(g_hHook, nCode, wParam, lParam);
}
//安装或者卸载钩子的函数
BOOL WINAPI SetKeyboardHook(BOOL bInstall, DWORD dwThreadId, HWND hWndCaller)
{
BOOL bOk;
g_hWnd = hWndCaller;

if (bInstall)
{
g_hHook = ::SetWindowsHookEx(WH_KEYBOARD, KeyboardHookProc,
ModuleFromAddress(KeyboardHookProc), dwThreadId);//安装消息钩子
bOk = (g_hHook != NULL);
}
else
{
bOk = ::UnhookWindowsHookEx(g_hHook);
g_hHook = NULL;
}

return bOk;
}

#include

#define HOOKDLL_EXPORTS
#include "HookDll.h"


// Shared data among all instances.
#pragma data_seg(".HOOKDATA")
HWND g_hWnd = NULL; // Window handle
HHOOK g_hHook = NULL; // Hook handle

// Get module from address
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 KeyboardHookProc(int nCode, WPARAM wParam, LPARAM lParam)
{
if (nCode < 0 || nCode == HC_NOREMOVE)
//向下传递消息使得hook链上的其他函数可以处理该消息
return ::CallNextHookEx(g_hHook, nCode, wParam, lParam);
if (lParam & 0x40000000) // Check the previous key state
{
return ::CallNextHookEx(g_hHook, nCode, wParam, lParam);
}
//将自定义消息发送到主窗口
//wParam 定义了虚拟键代码
//lParam 定义了按键数据
::PostMessage(g_hWnd, WM_KEYSTROKE, wParam, lParam);

return ::CallNextHookEx(g_hHook, nCode, wParam, lParam);
}
//安装或者卸载钩子的函数
BOOL WINAPI SetKeyboardHook(BOOL bInstall, DWORD dwThreadId, HWND hWndCaller)
{
BOOL bOk;
g_hWnd = hWndCaller;

if (bInstall)
{
g_hHook = ::SetWindowsHookEx(WH_KEYBOARD, KeyboardHookProc,
ModuleFromAddress(KeyboardHookProc), dwThreadId);//安装消息钩子
bOk = (g_hHook != NULL);
}
else
{
bOk = ::UnhookWindowsHookEx(g_hHook);
g_hHook = NULL;
}

return bOk;
}.def


[cpp]
LIBRARY CppHooKDll
EXPORTS
SetKeyboardHook
SECTIONS
.HOOKDATA Read Write Shared

LIBRARY CppHooKDll
EXPORTS
SetKeyboardHook
SECTIONS
.HOOKDATA Read Write Shared
在需要安装全局钩子的程序中调用:


[cpp]
::SetWindowsHookEx(WH_KEYBOARD, KeyboardHookProc,
ModuleFromAddress(KeyboardHookProc), 0)

::SetWindowsHookEx(WH_KEYBOARD, KeyboardHookProc,
ModuleFromAddress(KeyboardHookProc), 0)