Как повторить нажатия клавиш с SendInput? - PullRequest
1 голос
/ 29 октября 2009

Я пишу небольшой инструмент на VC ++ для записи нажатий клавиш, чтобы воспроизвести их позже, макро-рекордер. Он уже работает довольно хорошо, используя функцию перехвата клавиатуры, которая считывает каждое нажатие и отпускание клавиши. Воспроизведение работает с функцией SendInput () и в целом также работает нормально - за исключением повторения нажатий клавиш. Нажатие клавиши несколько раз после ее отпускания каждый раз не представляет проблем. Но нажатие и удерживание его для повторного ввода входного символа может быть записано, но может быть воспроизведено только в некоторых приложениях. Некоторые принимают и вводят символ несколько раз, некоторые делают это только один раз. (Воспроизводится, что и делает.) Сам рекордер макросов также видит, что удерживаемая клавиша удерживается нажатой только один раз во время воспроизведения через контрольный хук.

Итак, как я могу сделать так, чтобы SendInput отправлял несколько последовательных нажатий клавиши одного ключа, не добавляя собственные события отпускания ключа между ними? Отправка последовательности [нажмите] [нажмите] [нажмите] ... [отпустить] не всегда работает.

Ответы [ 3 ]

2 голосов
/ 02 декабря 2009

Вы можете отправлять несколько ключей за один вызов SendInput, но вам все равно нужно будет установить флаги keyup для каждого символа, чтобы получить одинаковые результаты при каждом типе нажатия клавиш.

если вам нужно отправить «аа», вы можете сделать это следующим образом.

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));
0 голосов
/ 02 декабря 2009

Насколько я знаю, как это работает, если получено событие нажатия клавиши без события нажатия клавиши в течение определенного периода времени (задержка повторения), клавиша считается "повторяющейся" до тех пор, пока не произойдет нажатие клавиши .

После отправки нажмите, нажмите, нажмите, отпустите не всегда, пытались ли вы записать время между нажатием клавиши «вверх» и «вверх», а затем повторять команды в то же время? Это становится в реальном времени, но должно вызывать те же самые повторные действия таким образом.

Я не могу придумать какой-либо другой способ получить столько же «повторов клавиш», сколько в оригинале, поскольку они не записываются при нажатии отдельных клавиш.

0 голосов
/ 29 октября 2009

У многих людей возникают проблемы с тем, что вызовы keyup и keydown «отклоняются» или «отбрасываются», и многие люди решают свои проблемы, помещая небольшой интервал времени между ними, чтобы гарантировать передачу всех команд:

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

Также есть команда SendInput.SendWait ....

Приветствия

...