如何将键盘事件发送到Windows中的所有类型的应用程序?

我们有一个简单的C ++程序,它使用keybd_event发送/模拟返回键事件到活动窗口。

keybd_event(VK_RETURN, 0x1c, 0, 0);

这适用于所有类型的Windows应用程序。 但我们喜欢将键盘事件发送给第三方应用程序,如GTA(游戏) - 这是行不通的。 GTA不会收到键盘事件。

为什么GTA没有收到键盘事件? 有没有办法让它使用keybd_event? 还是有任何其他解决方案将事件发送到所有类型的应用程序(使用通用Windows或C ++标准库)?


keybd_event是过时的API调用。 尝试使用Moder SendInput API函数

UINT WINAPI SendInput(
  _In_ UINT    nInputs,
  _In_ LPINPUT pInputs,
  _In_ int     cbSize
);

nInputs pInputs数组中的结构数量。

pInputs一组INPUT结构。 每个结构表示要插入到键盘或鼠标输入流中的事件。

cbSize INPUT结构的大小(以字节为单位)。 如果cbSize不是INPUT结构的大小,则该函数失败。

此功能受UIPI限制。 允许应用程序仅将输入注入到处于相同或较低完整性级别的应用程序中。

SendInput函数将INPUT结构中的事件串行插入到键盘或鼠标输入流中。 这些事件不会与用户(使用键盘或鼠标)或通过调用keybd_eventmouse_event或对SendInput其他调用插入的其他键盘或鼠标输入事件散布在一起。

此功能不会重置键盘的当前状态。 调用该函数时已经按下的任何键可能会干扰该函数生成的事件。 为避免此问题,请使用GetAsyncKeyState函数检查键盘的状态,并根据需要进行更正。

由于触摸键盘使用winnls.h中定义的代理宏来向系统发送输入,所以键盘事件挂钩上的监听器必须对来自触摸键盘的输入进行解码。 有关更多信息,请参阅代理和补充字符。

辅助功能应用程序可以使用SendInput来注入与由shell处理的应用程序启动快捷键相对应的键击。 此功能不保证适用于其他类型的应用程序。


这个API是低级的; 所以应用程序不会直接响应它。 该函数由中断处理程序调用。 也许你生成的输入不完全相同,你认为你需要这个应用程序来响应。 另外,这个API目前被我推荐使用的函数SendInput取代,而不是keybd_event。

链接地址: http://www.djcxy.com/p/18441.html

上一篇: How to send keyboard events to all kind of applications in windows?

下一篇: How to override Soft keyboard keyPress event in android?