c++全局鼠标hook无法成功

本人不喜vc++的界面~, 所以直接拿了vc的cl.exe 和 link.exe 来编译

dll文件网上搜来的:
// 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);
return 1;
}
else
{
return 1; // 屏蔽所有键盘消息
}
}
// 安装鼠标钩子过程的函数
HHOOK SetHook(HWND hwnd) // 参数是为了让dll获得调用进程的主窗口的句柄
{
g_hWnd = hwnd;
// hook所有进程的鼠标、键盘消息
g_hMouse = SetWindowsHookEx(WH_MOUSE_LL, MouseProc, GetModuleHandle("Hook.dll"), 0);

g_hKeyboard = SetWindowsHookEx(WH_KEYBOARD, KeyboardProc, GetModuleHandle("Hook.dll"), 0);
return g_hMouse;
}

然后自己写了一个简单调用程序:

返回的tmp是有值的, 可是仍然能够输入a的值, 也就是键盘没有被锁定

我看了你的代码,写的没有问题。但问题是你写的是控制台程序,它没有窗口消息处理过程,也就是不是窗口程序(GUI程序),hook的本意是拦截窗口处理过程,它不能拦截没有窗口的程序(这里说的不严密,有的程序有窗口,但是没有显示出来)。你可以在程序中建立一个wndclass的实体,添加上消息处理过程,在看看hook成功了。好像有点啰嗦,hook只针对含有消息处理过程的窗口程序。希望你能理解。
温馨提示:答案为网友推荐,仅供参考
第1个回答  2013-08-17
对于键盘和鼠标的全局钩子,是不需要dll的,直接就可以使用的。