如何在C ++中模拟按键

时间:2011-04-09 20:55:17

标签: c++ windows input keyboard

我想知道如何模拟C ++中的键抑制。如有代码,当我运行程序时,它按下字母“W”键。我不想在控制台窗口中显示它我只想在每次单击文本字段时显示“W”键。谢谢!

注意:我不是想成为垃圾邮件发送者。

5 个答案:

答案 0 :(得分:21)

看起来你想要使用SendInput()keybd_event()(这是一种较老的做同样事情的方式)。

答案 1 :(得分:6)

首先-在how to use sendinput function in C++上找到此答案。

查看代码部分:

// ...
    INPUT ip;
// ...
    // 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 "A" key
    ip.ki.wVk = 0x41; // virtual-key code for the "a" key
    ip.ki.dwFlags = 0; // 0 for key press
    SendInput(1, &ip, sizeof(INPUT));
// ...

我不知道魔术数字0x41的来源。

转到SendInput documentation page。仍然不知道0x41在哪里。

转到INPUT文档,然后从此处转到KEYBDINPUT文档。仍然没有魔法0x41

最后转到Virtual-Key Codes页,了解到Microsoft已给Ctrl(VK_CONTROL),Alt(VK_MENU),F1-F24(VK_F1-VK_F24,其中13-24是个谜)的名称,但是忘记命名角色。实际字符具有代码(0x41-0x5A),但没有像我在VK_A - VK_Z标头中寻找的winuser.h这样的名称。

答案 2 :(得分:1)

How can I fire a key press or mouse click event without touching any input device at system level?

哦,顺便说一句,你可能不想做这些事情;如果您正在模拟按键以使您的应用程序按照您希望的方式运行,那么您可能需要重新考虑如何设计应用程序。根据我的经验,发送按键并拦截它们只会造成麻烦。

答案 3 :(得分:0)

这是注释“ A”的虚拟键代码。这正是Windows开发人员决定计数的方式。 Here是具有所有键的链接,其中0x41被记录为A。

答案 4 :(得分:0)

我的两分钱。 ASCII 中的字符“A”是十进制的 65。但在十六进制中是 41。因此,0x41

看这里的 ASCII 表 http://www.asciitable.com/

也许您会对 SCAN 代码感兴趣,而不仅仅是 ASCII。 SCAN 代码甚至可以判断(和模拟)按键何时被按下,以及该按键何时被真正释放。 “输入缓冲区”中的 ASCII 代码通常也跟在 SCAN 代码之后。 在这里,关于“输入缓冲区”(实际上是 RAM 中的 FIFO 列表): How to clear input buffer in C?

这是一个小例子: http://csourcecodes.blogspot.com/2014/08/c-program-to-display-scan-and-ascii.html

如果您使用的是 Windows - 可能您最好的方法是前面提到的“SendInput”。 这是一个关于此的小文档: https://batchloaf.wordpress.com/2012/04/17/simulating-a-keystroke-in-win32-c-or-c-using-sendinput/

希望它对您有所帮助 - 至少有一点!... :)

成功!...