如何使用SendInput重复击键?

时间:2009-10-29 13:20:31

标签: c++ winapi keyboard hook

我正在VC ++中编写一个小工具来记录关键笔划以便稍后重放它们,一个宏录制器。它已经非常好用,使用键盘钩子功能读取每个按键和释放事件。播放使用SendInput()函数,通常也可以正常工作 - 除了重复击键。每次松开后按几次键都没问题。但是,按住它并按住它可以记录重复的输入字符,但只能在某些应用程序中重放。有些人接受并多次输入字符,有些只做一次。 (这是可重现的。)宏录制器本身也会在播放过程中通过其监听挂钩看到按下一次按下的键。

那么,如何让SendInput发送单个密钥的多个后续按键,而不在我自己之间添加密钥释放事件?发送一系列[按] [按] [按] ... [释放]并不总是有效。

3 个答案:

答案 0 :(得分:2)

您可以在一个SendInput调用中发送多个键,但是您仍然需要在每个char上设置keyup标志,以便在每种类型的键击上获得相同的结果。

如果你需要发送“aa”,你可以这样做。

INPUT input[4];

input[0].type = INPUT_KEYBOARD;
input[0].ki.wVk = 0;
input[0].ki.wScan = 'a';
input[0].ki.dwFlags = 0;

input[1].type = INPUT_KEYBOARD;
input[1].ki.wVk = 0;
input[1].ki.wScan = 'a';
input[1].ki.dwFlags = KEYEVENTF_KEYUP;

input[2].type = INPUT_KEYBOARD;
input[2].ki.wVk = 0;
input[2].ki.wScan = 'a';
input[2].ki.dwFlags = 0;

input[3].type = INPUT_KEYBOARD;
input[3].ki.wVk = 0;
input[3].ki.wScan = 'a';
input[3].ki.dwFlags = KEYEVENTF_KEYUP;

SendInput(4, input, sizeof(INPUT));

答案 1 :(得分:0)

许多人遇到的问题是keyup和keydown调用被“解雇”或“丢弃”,很多人通过在两者之间放置一小段缓冲时间来解决他们的问题,以确保所有命令都被转移:

sendinput  alt keydown
sendinput  3  keydown
sleep 50
sendinput 3 keyup
sendinput alt keyup

还有一个SendInput.SendWait命令....

干杯

答案 2 :(得分:0)

据我所知,它的工作方式是如果在一段时间内没有按键事件(重复延迟)接收到按键事件,则该按键被视为“重复”,直到按键发生

由于发送按,按,按,释放不起作用,您是否尝试记录按键和按键之间的时间,然后在同一时间重复命令?它变成了实时,但它应该触发相同的重复动作。

我无法想到任何其他方式最终会得到与原件相同数量的“重复重复”,因为这些不会被记录为单独的按键。