我们有一个简单的C ++程序,它使用keybd_event发送/模拟返回键事件到活动窗口。
keybd_event(VK_RETURN, 0x1c, 0, 0);
这适用于所有types的Windows应用程序。 但我们喜欢将键盘事件发送到第三方应用程序,如GTA(游戏) – 这是行不通的。 GTA不会收到键盘事件。
为什么GTA没有收到键盘事件? 有没有办法让它使用keybd_event? 还是有任何其他解决scheme发送事件到各种types的应用程序(使用通用的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_event , mouse_event或对SendInput其他调用插入的其他键盘或鼠标输入事件交织在一起。
此功能不会重置键盘的当前状态。 调用函数时已经按下的任何键都可能会干扰此函数生成的事件。 为避免此问题,请使用GetAsyncKeyState函数检查键盘的状态,并根据需要进行更正。
由于触摸键盘使用winnls.h中定义的代理宏来向系统发送输入,因此键盘事件挂接上的监听器必须对来自触摸键盘的输入进行解码。 有关更多信息,请参见代孕和补充字符。
辅助功能应用程序可以使用SendInput来注入与由shell处理的应用程序启动快捷键相对应的键击。 此功能不保证适用于其他类型的应用程序。
这个API是低级的; 所以应用程序不会直接回应。 该函数被中断处理程序调用。 也许你正在产生不完全相同的输入,你认为你需要这个应用程序来响应。 另外,这个API目前被我推荐使用的函数SendInput替代keybd_event。