SendInput показывает данные, отправленные не по порядку
Я экспериментирую с SendInput, отправляя строки в заметку. Я смешиваю команды SendInput с вызовами Memo.Lines.Add('....'). К моему удивлению, все команды Memo.Lines.Add выполняются перед любой из процедур SendInput. Зачем? Как я могу получить памятку для отображения информации в правильном порядке?
Мой код выглядит так:
procedure TForm1.Button1Click(Sender: TObject);
const
AStr = '123 !@# 890 *() abc ABC';
var
i: integer;
KeyInputs: array of TInput;
procedure KeybdInput(VKey: Byte; Flags: DWORD);
begin
SetLength(KeyInputs, Length(KeyInputs)+1);
KeyInputs[high(KeyInputs)].Itype := INPUT_KEYBOARD;
with KeyInputs[high(KeyInputs)].ki do
begin
wVk := VKey;
wScan := MapVirtualKey(wVk, 0);
dwFlags := Flags;
end;
end;
begin
Memo1.SetFocus;
Memo1.Lines.Add('AStr := ' + AStr);
Memo1.Lines.Add('');
Memo1.Lines.Add('Use: KeybdInput(ord(AStr[i]),0)');
SetLength(KeyInputs,0);
for i := 1 to Length(AStr) do KeybdInput(ord(AStr[i]),0);
SendInput(Length(KeyInputs), KeyInputs[0], SizeOf(KeyInputs[0]));
Memo1.Lines.Add('');
Memo1.Lines.Add('Use: KeybdInput(vkKeyScan(AStr[i]),0)');
SetLength(KeyInputs,0);
for i := 1 to Length(AStr) do KeybdInput(vkKeyScan(AStr[i]),0);
SendInput(Length(KeyInputs), KeyInputs[0], SizeOf(KeyInputs[0]));
end;
И я ожидал, что результат будет выглядеть так:
Но на самом деле это выглядит так:
1 ответ
Входы клавиатуры, которые вы отправляете с SendInput
проходит через систему обмена сообщениями Windows и попадает в очередь сообщений ваших приложений. Очередь сообщений не обрабатывается перед выходом из Button1Click()
,
Когда что-то добавляется в очередь, требуется время, чтобы оно вышло из очереди
Чтобы увидеть события в том порядке, в котором вы ожидаете, вам необходимо вставить вызовы в Application.Processmessages()
после каждого SendInput()
, призвание Application.ProcessMessages()
как правило, не рекомендуется:
Темная сторона Application.ProcessMessages в приложениях Delphi