我想编写一个 C++ 代码来模拟按下键盘键“A”:
// Set up a generic keyboard event.
ip.type = INPUT_KEYBOARD;
ip.ki.wScan = 0; // hardware scan code for key
ip.ki.time = 0;
ip.ki.dwExtraInfo = 0;
// Press the "..." key
ip.ki.wVk = code; // virtual-key code for the "a" key
ip.ki.dwFlags = 0; // 0 for key press
SendInput(1, &ip, sizeof(INPUT));
// Release the "..." key
ip.ki.dwFlags = KEYEVENTF_KEYUP; // KEYEVENTF_KEYUP for key release
SendInput(1, &ip, sizeof(INPUT));
当我启动其他程序并等待我的程序执行时,它工作正常,单击“A”并且第一个程序对其做出反应。但我发现在另一个应用程序中,我的操作以某种方式被阻止(我可以手动按键盘上的“A”,但使用我的程序不会导致任何操作)。
那么,我可以做些什么来使程序中按“A”与手动按“A”更加相同(所以第二个程序不会识别它是从程序调用的)?
我没有第二个程序的源代码,也不知道它如何识别“A”没有被手动按下。
我确信我想要对代码做出反应的窗口是前台,接收并阻止我的密钥(因此它可以确定该事件不是来自用户而是来自程序)。
您也可以使用 SendInput() 发送硬件扫描代码(而不是虚拟扫描代码,DirectInput 可能会忽略虚拟扫描代码)。虽然记录很少,但 SendInput() 确实可以绕过 DirectInput。 Eric 的解决方案不起作用的原因是他设置了硬件扫描代码,但最终使用了虚拟扫描代码(通过将 dwFlags 设置为 0 并将 wVk 设置为非零)。
本质上,要执行您想要设置的按键:
ip.ki.dwFlags = KEYEVENTF_SCANCODE;
要进行按键释放,请设置:
ip.ki.dwFlags = KEYEVENTF_SCANCODE | KEYEVENTF_KEYUP;
下面是完整的工作示例,它打印字母“a”。您可以扫码查找其他here.
#define WINVER 0x0500
#include <windows.h>
using namespace std;
int main()
{
//Structure for the keyboard event
INPUT ip;
Sleep(5000);
//Set up the INPUT structure
ip.type = INPUT_KEYBOARD;
ip.ki.time = 0;
ip.ki.wVk = 0; //We're doing scan codes instead
ip.ki.dwExtraInfo = 0;
//This let's you do a hardware scan instead of a virtual keypress
ip.ki.dwFlags = KEYEVENTF_SCANCODE;
ip.ki.wScan = 0x1E; //Set a unicode character to use (A)
//Send the press
SendInput(1, &ip, sizeof(INPUT));
//Prepare a keyup event
ip.ki.dwFlags = KEYEVENTF_SCANCODE | KEYEVENTF_KEYUP;
SendInput(1, &ip, sizeof(INPUT));
return 0;
}
注意:您可以通过向 SendInput() 传递 INPUT 结构数组来组合按键(例如,shift + a 表示 A)。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)