如何拦截键盘、鼠标与触摸输入?解决新版Windows触摸板拦截失效问题
解决新版Windows中BlockInput无法拦截触摸板输入的问题
在新版Windows系统中,Precision Touchpad(精准触摸板)的输入通常被识别为触摸(Touch)事件而非传统鼠标输入,而BlockInput()函数仅能拦截标准键盘、鼠标输入,无法覆盖这类触摸设备的输入事件,这就是问题的核心原因。
以下是两种可行的解决方案:
方案一:使用全局钩子拦截触摸与输入消息
通过SetWindowsHookEx注册全局低级钩子,拦截触摸消息(WM_TOUCH)、鼠标消息和键盘消息,实现全面的输入拦截。
代码示例
#include <windows.h> #include <iostream> HHOOK hMouseHook = NULL; HHOOK hKeyboardHook = NULL; HHOOK hTouchHook = NULL; // 低级鼠标钩子处理函数 LRESULT CALLBACK LowLevelMouseProc(int nCode, WPARAM wParam, LPARAM lParam) { if (nCode >= 0) { // 拦截所有鼠标消息 return 1; } return CallNextHookEx(hMouseHook, nCode, wParam, lParam); } // 低级键盘钩子处理函数 LRESULT CALLBACK LowLevelKeyboardProc(int nCode, WPARAM wParam, LPARAM lParam) { if (nCode >= 0) { // 拦截所有键盘消息 return 1; } return CallNextHookEx(hKeyboardHook, nCode, wParam, lParam); } // 触摸消息钩子处理函数 LRESULT CALLBACK TouchProc(int nCode, WPARAM wParam, LPARAM lParam) { if (nCode >= 0) { MSG* pMsg = reinterpret_cast<MSG*>(lParam); // 拦截触摸相关消息 if (pMsg->message == WM_TOUCH || pMsg->message == WM_GESTURE) { return 1; } } return CallNextHookEx(hTouchHook, nCode, wParam, lParam); } int main() { // 注册全局钩子 hMouseHook = SetWindowsHookEx(WH_MOUSE_LL, LowLevelMouseProc, GetModuleHandle(NULL), 0); hKeyboardHook = SetWindowsHookEx(WH_KEYBOARD_LL, LowLevelKeyboardProc, GetModuleHandle(NULL), 0); // 注册触摸消息钩子(Windows 7及以上支持) hTouchHook = SetWindowsHookEx(WH_GETMESSAGE, TouchProc, GetModuleHandle(NULL), 0); if (!hMouseHook || !hKeyboardHook || !hTouchHook) { std::cout << "钩子注册失败,错误码:" << GetLastError() << std::endl; return 1; } std::cout << "输入已拦截,按任意键解除..." << std::endl; std::cin.get(); // 卸载钩子 UnhookWindowsHookEx(hMouseHook); UnhookWindowsHookEx(hKeyboardHook); UnhookWindowsHookEx(hTouchHook); std::cout << "输入已解除拦截" << std::endl; return 0; }
方案二:临时禁用触摸板设备
通过Windows设备接口直接禁用触摸板设备,这种方式更彻底,但需要处理设备枚举与权限问题。
实现思路
- 使用
SetupDiGetClassDevs枚举系统中所有触摸/触摸板设备; - 通过
SetupDiSetClassInstallParams设置设备禁用参数; - 调用
SetupDiCallClassInstaller执行禁用操作; - 恢复输入时重复上述步骤,将设备状态改为启用。
关键注意事项
- 程序必须以管理员身份运行,否则会因权限不足操作失败;
- 需提前保存目标设备的实例ID,确保恢复时能精准定位到被禁用的触摸板;
- 触摸板设备的类GUID通常为
GUID_DEVINTERFACE_TOUCH或GUID_DEVINTERFACE_MOUSE(针对Precision Touchpad)。
通用注意事项
- 所有输入拦截操作都需要管理员权限,否则会执行失败;
- 全局钩子会影响系统所有进程,使用完毕后务必正确卸载,避免引发系统异常;
- 部分Precision Touchpad设备会同时发送触摸和鼠标模拟消息,需同时拦截两类消息才能完全生效。
内容的提问来源于stack exchange,提问作者Akshay Baiplawat
相关产品推荐
相关产品推荐

