您的位置:首页 > 其它

全局钩子(hook鼠标键盘消息)

2011-04-10 17:51 567 查看
生成DLL文件,模块定义文件为:

LIBRARY Hook

EXPORTS

SetHook @2

实现文件如下。其中g_hWnd为所有进程共享,并且绕过了系统对可写数据的写时复制机制,维护的是一份拷贝。

// Hook.cpp
#include <windows.h>
HHOOK g_hMouse = NULL;
HHOOK g_hKeyboard = NULL;
// 为Hook.DLL创建一个新的节,将全局变量g_hWnd放入其中
#pragma data_seg("MySec")
HWND g_hWnd = NULL;
#pragma data_seg()
// 设置刚创建的节为共享的节
#pragma comment(linker, "/section:MySec,RWS")
// 鼠标钩子过程
LRESULT CALLBACK MouseProc(
int nCode,      // hook code
WPARAM wParam,  // message identifier
LPARAM lParam   // mouse coordinates
)
{
return 1;	// 屏蔽所有鼠标消息
}
// 键盘钩子过程
LRESULT CALLBACK KeyboardProc(
int code,       // hook code
WPARAM wParam,  // virtual-key code
LPARAM lParam   // keystroke-message information
)
{
// 后门按键用于结束该进程
if (VK_F2 == wParam)
{
::SendMessage(g_hWnd, WM_CLOSE, 0, 0);
UnhookWindowsHookEx(g_hKeyboard);
UnhookWindowsHookEx(g_hMouse);
}
else
{
return 1;	// 屏蔽所有键盘消息
}
}
// 安装鼠标钩子过程的函数
void SetHook(HWND hwnd)	// 参数是为了让dll获得调用进程的主窗口的句柄
{
g_hWnd = hwnd;
// hook所有进程的鼠标、键盘消息
g_hMouse = SetWindowsHookEx(WH_MOUSE, MouseProc, GetModuleHandle("Hook.dll"), 0);
g_hKeyboard = SetWindowsHookEx(WH_KEYBOARD, KeyboardProc, GetModuleHandle("Hook.dll"), 0);
}


调用DLL的进程的实现:

/////////////////////////////////////////////////////////////////////////////
// CHookTestDlg message handlers
// 导入函数
__declspec(dllimport) void SetHook(HWND hwnd);
BOOL CHookTestDlg::OnInitDialog()
{
// TODO: Add extra initialization here
// 顶层窗口及最大化窗口的实现
int cxScreen, cyScreen;
cxScreen = GetSystemMetrics(SM_CXSCREEN);
cyScreen = GetSystemMetrics(SM_CYSCREEN);
SetWindowPos(&wndTopMost, 0, 0, cxScreen, cyScreen, SWP_SHOWWINDOW);
// 调用DLL中的函数
SetHook(m_hWnd);
return TRUE;  // return TRUE  unless you set the focus to a control
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: