420次浏览

C/C++ 使用SetWindowsHookEx 设置全局键盘钩子

DLL方式

SetWindowsHookEx 设置全局低级键盘钩子屏蔽所有键盘消息, 除了”ctrl+alt+.” 屏蔽不到之外, 其他按键消息都是可以屏蔽到的, 然后呢hook代码写在了dll中, 弄这程序主要目的就是为了防止误触键盘。

其实WH_KEYBOARD_LL类型低级键盘钩子不用写在dll中的

放张效果图:

这两个工程文件我都打包好咯, 编译环境是vs2015, 下载地址: https://66-1251737204.cos.ap-beijing-1.myqcloud.com/citext.cn/Software/hook%E9%94%AE%E7%9B%98.rar

非DLL方式

另外再附上不采用DLL方式的全局键盘钩子代码, 先放张效果图, 代码在后边哦。

#include<Windows.h>
#include<iostream>

std::string get_time()
{
	SYSTEMTIME sys;
	GetLocalTime(&sys);
	char time[1024] = { 0 };
	sprintf(time, "[%4d/%02d/%02d %02d:%02d:%02d]", sys.wYear, sys.wMonth, sys.wDay, sys.wHour, sys.wMinute, sys.wSecond);

	return std::string(time);
}

LRESULT CALLBACK KeyboardProc(int nCode, WPARAM wParam, LPARAM lParam)
{
	/*
	typedef struct tagKBDLLHOOKSTRUCT {
	DWORD     vkCode;		// 按键代号
	DWORD     scanCode;		// 硬件扫描代号,同 vkCode 也可以作为按键的代号。
	DWORD     flags;		// 事件类型,一般按键按下为 0 抬起为 128。
	DWORD     time;			// 消息时间戳
	ULONG_PTR dwExtraInfo;	// 消息附加信息,一般为 0。
	}KBDLLHOOKSTRUCT,*LPKBDLLHOOKSTRUCT,*PKBDLLHOOKSTRUCT;
	*/
	KBDLLHOOKSTRUCT *ks = (KBDLLHOOKSTRUCT*)lParam;		// 包含低级键盘输入事件信息

	char data[1024];
	DWORD code = ks->vkCode;

	std::string t = get_time();
	char state[20];


	if (wParam == WM_KEYDOWN)
	{
		strcpy(state, "按下");
	}
	else if (wParam == WM_KEYUP)
	{
		strcpy(state, "放开");
	}

	sprintf(data, "%s 键代码:%d %s", t.c_str(), code, state);

	std::cout << data << std::endl;


			 // 将消息传递给钩子链中的下一个钩子
	return CallNextHookEx(NULL, nCode, wParam, lParam);
}

int main()
{
	HINSTANCE hInst = GetModuleHandle(NULL);
	HHOOK g_Hook = SetWindowsHookEx(WH_KEYBOARD_LL, KeyboardProc, hInst, 0);

	// 消息循环是必须的,Windows直接在你自己的进程中调用你的hook回调.要做这个工作,
	//需要一个消息循环.没有其他机制可以让您的主线程进行回调,
	//回调只能在您调用Get / PeekMessage()以使Windows可以控制时发生.

	MSG msg;
	while (GetMessage(&msg, NULL, 0, 0))
	{
		TranslateMessage(&msg);
		DispatchMessage(&msg);
	}

	UnhookWindowsHookEx(g_Hook);

    return 0;
}

发表评论

电子邮件地址不会被公开。 必填项已用*标注