测试需要,仅供学习使用。
测试环境:Win10+VS2019
勾子在dll内:GlobalHook.dll
GlobalHook.h
#ifndef __GLOBAL_HOOK_H__
#define __GLOBAL_HOOK_H__
#include<windows.h>
#include<stdio.h>
//勾子消息回调事件
typedef void(_stdcall* HookCallBack)(int code, WPARAM wParam, LPARAM lParam);
#define CINTERFACEAPI extern "C" __declspec(dllexport)
CINTERFACEAPI void UnHook();
CINTERFACEAPI void SetHook();
CINTERFACEAPI void SetHookCallBack(HookCallBack callBack);
#endif // !__GLOBAL_HOOK_H__
GlobalHook.cpp
#include "GlobalHook.h"
HookCallBack hookCallBack = nullptr;
HHOOK g_hMouse = NULL;
HHOOK g_hKeyBoard = NULL;
//鼠标与键盘钩子共用一个回调函数
LRESULT CALLBACK HookBoardProc(int code, WPARAM wParam, LPARAM lParam) {
if (hookCallBack != nullptr)
{
hookCallBack(code, wParam, lParam);
}
//传给下一个钩子
return CallNextHookEx(g_hKeyBoard, code, wParam, lParam); //执行失败会返回0
//return TRUE; //return ture说明全部屏蔽
//return 0;//返回系统处理
}
CINTERFACEAPI void SetHook() {
g_hMouse = SetWindowsHookEx(WH_MOUSE_LL, HookBoardProc, NULL, 0);
g_hKeyBoard = SetWindowsHookEx(WH_KEYBOARD_LL, HookBoardProc, NULL, 0);
}
CINTERFACEAPI void UnHook()
{
if (hookCallBack != nullptr)
{
hookCallBack = nullptr;
}
UnhookWindowsHookEx(g_hMouse);
UnhookWindowsHookEx(g_hKeyBoard);
}
CINTERFACEAPI void SetHookCallBack(HookCallBack callBack)
{
hookCallBack = callBack;
}
在控制台程序中引用(动态创建隐藏窗口)
main.cpp
#include "GlobalHook.h"
HWND Hide_Hwnd;
//勾子消息回调函数
void _stdcall OnHookCallBack(int code, WPARAM wParam, LPARAM lParam)
{
if (code == HC_ACTION)
{
//鼠标消息处理
if (WM_LBUTTONDOWN == wParam || WM_RBUTTONDOWN == wParam)
{
MOUSEHOOKSTRUCT* pMouse = (MOUSEHOOKSTRUCT*)lParam;
printf("Mouse:(%d,%d)\n", pMouse->pt.x, pMouse->pt.y);
}
//键盘消息处理
if (WM_KEYDOWN == wParam || WM_SYSKEYDOWN == wParam)
{
KBDLLHOOKSTRUCT* pKDB = (KBDLLHOOKSTRUCT*)lParam;
printf("vKCode:%d\n", pKDB->vkCode);
if (pKDB->vkCode == 27)
{
::PostMessage(Hide_Hwnd, WM_QUIT, 0, 0); //关闭Hide_Hwnd所指定的消息循环,以达到关闭窗口的目的
}
}
}
}
int main()
{
HINSTANCE hInstance;
hInstance = GetModuleHandle(NULL); //获取一个应用程序或动态链接库的模块句柄
WNDCLASS Hide_WND;
LPCWSTR windowstitle = L"HideWindow";
Hide_WND.cbClsExtra = 0;
Hide_WND.cbWndExtra = 0;
Hide_WND.hCursor = LoadCursor(hInstance, IDC_ARROW); //鼠标风格
Hide_WND.hIcon = LoadIcon(hInstance, IDI_APPLICATION); //图标风格
Hide_WND.lpszMenuName = NULL; //菜单名
Hide_WND.style = CS_HREDRAW | CS_VREDRAW; //窗口的风格
Hide_WND.hbrBackground = (HBRUSH)COLOR_WINDOW; //背景色
Hide_WND.lpfnWndProc = DefWindowProc;//WindowProc; //【关键】采用自定义消息处理函数,也可以用默认的DefWindowProc
Hide_WND.lpszClassName = windowstitle; //【关键】该窗口类的名称
Hide_WND.hInstance = hInstance; //【关键】表示创建该窗口的程序的运行实体代号
RegisterClass(&Hide_WND);
Hide_Hwnd = CreateWindow(
windowstitle, //【关键】上面注册的类名lpszClassName,要完全一致
windowstitle, //窗口标题文字
WS_OVERLAPPEDWINDOW, //窗口外观样式
0, //窗口相对于父级的X坐标
0, //窗口相对于父级的Y坐标
320, //窗口的宽度
240, //窗口的高度
NULL, //没有父窗口,为NULL
NULL, //没有菜单,为NULL
hInstance, //当前应用程序的实例句柄
NULL); //没有附加数据,为NULL
// 显示窗口
//ShowWindow(hwnd, SW_SHOW);
//隐藏窗口
ShowWindow(Hide_Hwnd, SW_HIDE);
// 更新窗口
UpdateWindow(Hide_Hwnd);
printf("SetHook\n");
SetHookCallBack(OnHookCallBack);
SetHook();
// 消息循环
MSG msg;
while (GetMessage(&msg, NULL, 0, 0))
{
TranslateMessage(&msg);
DispatchMessage(&msg);
}
UnHook();
printf("UnHook\n");
return 0;
}