有没有一种方法可以模拟C++中的按键,没有软件可以说我实际上没有按下按键

Is there a method to simulate a key press in C++ in a way that no software could tell that i'm not actually pressing the key

本文关键字:软件 实际上 可以说 一种 方法 C++ 模拟 有没有      更新时间:2023-10-16

我尝试过SendInput和keybd_event,有时它们工作得很好,但一些正在运行的程序无法识别我想使用c++代码按键。c++中是否有一个信号与我机械按键时发出的信号相同(这样就没有程序能分辨出区别)?

或者,如果这在C++中是不可能的,那么在任何其他编程语言中都可能吗?

c++中是否有一个信号与我机械按键时发出的信号相同(这样就没有程序能分辨出区别)?

这正是CCD_ 1和CCD_。它们将事件注入到实际键盘驱动程序将其事件插入的相同硬件输入队列中。它们以相同的方式进行处理和路由,因此系统的大多数人不知道物理事件和注入事件之间的区别。

然而,系统中有一个领域确实知道区别:通过SetWindowsHookEx(WH_KEYBOARD_LL)的低级键盘挂钩。回调函数接收指向KBDLLHOOKSTRUCT结构的指针,该结构的flags成员包含用于注入事件的LLKHF_INJECTED标志。回调可以选择放弃事件,这样它们就不会到达应用程序。

因此,任何对模拟按键没有反应的应用程序都可能被专门编码为忽略注入的输入。

防止这种情况的唯一方法(不需要编写自己的键盘驱动程序)是编写自己的低级键盘挂钩,并在安装了其他低级键盘挂钩后安装。这将把你的钩子放在钩子链的顶部。然后,它可以通过简单地而不是调用CallNextHookEx()来跳过其他挂钩。钩子是按从最后到第一的顺序调用的。根据文件:

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

然而,如果一个应用程序遇到了使用键盘挂钩忽略注入事件的麻烦,它很可能也会考虑挂钩顺序,例如定期重新安装挂钩,将其放回挂钩链的顶部,以避免其他挂钩的干扰。