我正在尝试制作一个类似于 ReWASD 的程序,我需要在应用程序中阻止键盘/鼠标输入以避免两个设备之间的冲突
我尝试使用函数 BlockInput()/SetWindowsHookEx()
阻止输入(无需编写自定义驱动程序)的唯一方法是使用
SetWindowsHookEx()
键盘/鼠标挂钩。它的文档告诉你如何阻止每种类型的钩子的输入:
返回值
类型:LRESULT
如果代码小于零,挂钩过程必须返回 CallNextHookEx 返回的值。
如果code大于或等于0,并且钩子程序没有处理消息,强烈建议您调用CallNextHookEx并返回它返回的值;否则,其他安装了 WH_KEYBOARD 挂钩的应用程序将不会收到挂钩通知,因此可能会出现错误行为。 如果钩子过程处理了消息,它可能会返回一个非零值,以防止系统将消息传递给钩子链的其余部分或目标窗口过程。
返回值
类型:LRESULT
如果 nCode 小于零,钩子过程必须返回 CallNextHookEx 返回的值。
如果nCode大于或等于0,并且钩子程序没有处理消息,强烈建议您调用CallNextHookEx并返回它返回的值;否则,其他安装了 WH_KEYBOARD_LL 挂钩的应用程序将不会收到挂钩通知,因此可能会出现错误行为。 如果钩子过程处理了消息,它可能会返回一个非零值,以防止系统将消息传递给钩子链的其余部分或目标窗口过程。
返回值
类型:LRESULT
如果 nCode 小于零,钩子过程必须返回 CallNextHookEx 返回的值。
如果nCode大于或等于0,并且钩子程序没有处理消息,强烈建议您调用CallNextHookEx并返回它返回的值;否则,其他安装了 WH_MOUSE 挂钩的应用程序将不会收到挂钩通知,因此可能会出现错误行为。 如果钩子过程处理了消息,它可能会返回一个非零值,以防止系统将消息传递给目标窗口过程。
返回值
类型:LRESULT
如果 nCode 小于零,钩子过程必须返回 CallNextHookEx 返回的值。
如果nCode大于或等于0,并且钩子程序没有处理消息,强烈建议您调用CallNextHookEx并返回它返回的值;否则,其他安装了 WH_MOUSE_LL 挂钩的应用程序将不会收到挂钩通知,因此可能会出现错误行为。 如果钩子过程处理了消息,它可能会返回一个非零值,以防止系统将消息传递给钩子链的其余部分或目标窗口过程。
但是请注意,只有
WH_MOUSE
钩子会告诉您鼠标输入被发送到的 HWND
。其他挂钩不会给您HWND
。当事件被处理时,事件将转到具有输入焦点的HWND
。
此外,没有一个挂钩会告诉您发送输入的设备(如果您只想阻止来自特定设备的输入),因为您必须使用 Raw Input API 并将其事件与
SetWindowHookEx()
挂钩事件(因为原始输入不能阻止输入)。请参阅:Combining Raw Input and keyboard Hook to selectively block input from multiple keyboards有关这样做的详细信息(和陷阱)。