C++中hwnd键盘/鼠标输入的块输入

问题描述 投票:0回答:1

我正在尝试制作一个类似于 ReWASD 的程序,我需要在应用程序中阻止键盘/鼠标输入以避免两个设备之间的冲突

我尝试使用函数 BlockInput()/SetWindowsHookEx()

c++ winapi
1个回答
0
投票

阻止输入(无需编写自定义驱动程序)的唯一方法是使用

SetWindowsHookEx()
键盘/鼠标挂钩。它的文档告诉你如何阻止每种类型的钩子的输入:

KeyboardProc 回调函数

返回值

类型:LRESULT

如果代码小于零,挂钩过程必须返回 CallNextHookEx 返回的值。

如果code大于或等于0,并且钩子程序没有处理消息,强烈建议您调用CallNextHookEx并返回它返回的值;否则,其他安装了 WH_KEYBOARD 挂钩的应用程序将不会收到挂钩通知,因此可能会出现错误行为。 如果钩子过程处理了消息,它可能会返回一个非零值,以防止系统将消息传递给钩子链的其余部分或目标窗口过程。

LowLevelKeyboardProc 回调函数

返回值

类型:LRESULT

如果 nCode 小于零,钩子过程必须返回 CallNextHookEx 返回的值。

如果nCode大于或等于0,并且钩子程序没有处理消息,强烈建议您调用CallNextHookEx并返回它返回的值;否则,其他安装了 WH_KEYBOARD_LL 挂钩的应用程序将不会收到挂钩通知,因此可能会出现错误行为。 如果钩子过程处理了消息,它可能会返回一个非零值,以防止系统将消息传递给钩子链的其余部分或目标窗口过程。

MouseProc 回调函数

返回值

类型:LRESULT

如果 nCode 小于零,钩子过程必须返回 CallNextHookEx 返回的值。

如果nCode大于或等于0,并且钩子程序没有处理消息,强烈建议您调用CallNextHookEx并返回它返回的值;否则,其他安装了 WH_MOUSE 挂钩的应用程序将不会收到挂钩通知,因此可能会出现错误行为。 如果钩子过程处理了消息,它可能会返回一个非零值,以防止系统将消息传递给目标窗口过程。

LowLevelMouseProc 回调函数

返回值

类型: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有关这样做的详细信息(和陷阱)。

© www.soinside.com 2019 - 2024. All rights reserved.