是否有一种方法可以模拟C ++中的按键操作,其方式是没有软件可以告诉我实际上没有按下键

时间:2016-04-30 14:17:40

标签: c++ winapi events key signals

我已经尝试过SendInput和keybd_event,有时它们工作正常,但有些正在运行的程序无法识别我想使用c ++代码按键。 c ++中的信号是否与机械按键时发出的信号相同(这样任何程序都无法区分)?

或者如果在C ++中不可能,是否可以使用任何其他编程语言?

1 个答案:

答案 0 :(得分:2)

  

c ++中的信号是否与机械按键时发出的信号相同(这样任何程序都无法区分)?

这正是SendInput()keybd_event()的意思。 They inject events into the same hardware input queue that the actual keyboard driver inserts its events into。它们以相同的方式处理和路由,因此大多数系统不知道物理事件和注入事件之间的区别。

但是,系统的一个区域 知道区别:通过SetWindowsHookEx(WH_KEYBOARD_LL)的低级键盘钩子。 callback function接收指向KBDLLHOOKSTRUCT结构的指针,其flags成员包含注入事件的LLKHF_INJECTED标志。回调可以选择丢弃事件,以便他们无法访问应用程序。

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

防止这种情况(不编写自己的键盘驱动程序)的唯一方法是编写自己的低级键盘挂钩,并在安装了其他低级键盘挂钩后进行安装。这会将您的钩子放在钩链的顶部。然后,它可以通过 not 调用CallNextHookEx()来跳过其他挂钩。钩子以倒数第一顺序调用。根据文件:

  

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

但是,如果某个应用程序遇到使用键盘挂钩忽略注入事件的麻烦,可能还会考虑挂钩顺序,例如通过定期重新安装其挂钩以将其重新置于顶部挂钩链条以避免其他挂钩的干扰。