C++ 如何使用SendInput重复按键?

C++ 如何使用SendInput重复按键?,c++,winapi,keyboard,hook,C++,Winapi,Keyboard,Hook,我正在用VC++编写一个小工具来记录击键,以便以后回放,一个宏记录器。它已经相当不错了,使用了一个键盘钩子函数来读取每个按键和释放事件。播放与SendInput()函数一起工作,通常也可以正常工作-除了重复按键。每次松开一个键后按几次都没有问题。但按下并按住该键,可以记录要重复的输入字符,但只能在某些应用程序中重放。有些人多次接受并输入字符,有些人只输入一次。(它是可复制的,可以复制。)宏记录器本身也可以通过其监控挂钩在播放过程中看到按下的键只被按下一次 那么,如何让SendInput发送单个键

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


那么,如何让SendInput发送单个键的多个后续键笔划,而不在其间添加自己的键释放事件呢?正在发送[按][按][按]的序列。。。[release]并不总是起作用。

许多人都会遇到按键通话被“拒绝”或“丢弃”的问题,许多人通过在这两个通话之间放置一个小的缓冲时间来解决问题,以确保所有命令都被传输:

sendinput  alt keydown
sendinput  3  keydown
sleep 50
sendinput 3 keyup
sendinput alt keyup
还有一个命令


Cheers

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

由于发送press、press、press、release并不总是有效,您是否尝试过记录下按键和上按键之间的时间,然后在同一时间重复这些命令?它变成了实时的,但它应该以这种方式触发相同的重复动作


我想不出任何其他方法可以得到与原版相同数量的“按键重复”,因为它们不会被记录为单独的按键。

您可以在一次SendInput调用中发送多个按键,但您仍然需要在每个字符上设置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));

不幸的是,SendInput不允许延迟。您只需将要发送的关键事件作为输入[],它就会立即发送这些事件—以一个整体的形式发送,其间没有其他事件。SendWait是一个.NET方法,我这里不使用.NET。此外,“等待”不会影响实际的SendInput调用,正如在.NET Reflector中可以看到的那样。(超出了限制)发送一次密钥总是有效的,这里没有问题。重复发送并不总是有效的,就像你的语法:sendinput 3 keydown;SendInput3键控;SendInput3键控;发送输入3键。(这是钩子函数报告用户重复击键的顺序。)对不起,我不明白你的意思。我正在将我记录的确切事件从钩子函数发送到SendInput()。数据结构中有一个时间成员,但它似乎没有任何效果。时间成员是时间戳,而不是持续时间。你想模拟用户按住一个键350毫秒,然后你向下发送一个键,等待350毫秒,然后向上发送一个键。是的,我想这就是我需要做的。但奇怪的是,这些关键事件无法从钩子函数中看到。因此,如果你使用的是真正的键盘,它实际上只发送(向下,向下,向上)而不是(向下,向上,向下,向上)。我希望我能以记录事件的方式发送事件。接下来的问题是在什么关键事件之后插入关键事件。显然,当按下Alt键,按住它,然后按下字母时,插入键不需要,因为它可能会使菜单或其他内容聚焦。谢谢@Jan,顺便说一句,你的意思是。输入还是。输入?我无法计算Itype的C++引用,但是Itype提出了德尔福代码。如果你在Delphi中这样做,你需要设置<代码>输入[n]。code>type在Delphi中是一个保留关键字,因此该字段被重命名为
Itype
。啊,我看到@Jan了,谢谢你提供的信息。