【发布时间】:2013-09-09 22:06:18
【问题描述】:
我想编写一个 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的发明是为了解决在向keybd_event单独呼叫中发送单独键盘消息的问题。不要滥用SendInput多次使用单个INPUT结构调用它。构建一组INPUT结构并一次性发送它们。 -
我也使用了 keybd_event ,结果相同。仍然感谢您指出一些提示。
-
我怀疑在您提供有关此“第二个程序”的更多详细信息之前,这个问题会出现任何问题。
-
afaik。似乎其他程序总是检查发件人的 hwnd。这是一种保护。
标签: c++ winapi keyboard hook sendinput