221次浏览

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

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

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

放张效果图:

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

再贴一下dll代码中的hook回调函数:

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;		// 包含低级键盘输入事件信息

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

	string t = get_time();
	wchar_t buffer[1024];
	wchar_t state[20];
	AnsiToUnicode(buffer, t.c_str());
	
	if (wParam == WM_KEYDOWN)
	{
		wcscpy(state, L"按下");
	}
	else if (wParam == WM_KEYUP)
	{
		wcscpy(state, L"放开");
	}

	wsprintf(data, L"%s 键代码:%d %s\r\n", buffer, code,state);
	SendMessage(Edit_hwnd, EM_REPLACESEL, 0, (LPARAM)data);//往编辑框里边叠加内容

	return 1;//屏蔽所有按键




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

发表评论

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