Какой простой способ программного моделирования пользовательского ввода?
У меня есть диалоговое окно, которое появляется в результате ошибки. Я хочу, чтобы диалоговое окно оставалось открытым в течение не менее 30 секунд и закрывалось через 30 секунд после получения последнего пользовательского ввода (мышь или клавиатура).
Я могу реализовать это, проверив значение, возвращаемое GetLastInputInfo, и закрыв диалоговое окно, когда это происходит более 30 секунд назад, но если диалоговое окно появляется, когда пользователь не находился у мыши или клавиатуры в течение 30 секунд, тест GetLastInputInfo проходит немедленно, и диалог снова закрывается снова. Я мог бы сделать это с другим таймером, но я полагаю, что было бы намного проще имитировать перемещение мыши или нажатие (безвредное) нажатия клавиш непосредственно перед открытием диалога. Предполагалось бы также иметь преимущество в том, что система вышла из заставки.
Какой самый простой однострочный фрагмент кода Delphi для этого?
3 ответа
Самым простым является использование keybd_event
функция (одна строка кода)
keybd_event(Ord('A'), 0, 0, 0);
Также вы можете использовать SendInput
функция, но требует более одной строки:)
Var
pInputs : TInput;
begin
pInputs.Itype := INPUT_KEYBOARD;
pInputs.ki.wVk := Ord('A');
pInputs.ki.dwFlags := KEYEVENTF_KEYUP;
SendInput(1, pInputs, SizeOf(pInputs));
end;
Введите многобайтовые символы с помощью keybd_event:
procedure InsertText(text:string);
var i:integer;
j:integer;
ch:byte;
str:string;
begin
i:=1;
while i<=Length(text) do
begin
ch:=byte(text[i]);
if Windows.IsDBCSLeadByte(ch) then
begin
Inc(i);
str:=inttostr(MakeWord(byte(text[i]), ch));
keybd_event(VK_MENU, MapVirtualKey(VK_MENU, 0), 0, 0);
j:=1;
while j<=Length(str) do
begin
keybd_event(96+strtoint(str[j]), MapVirtualKey(96+strtoint(str[j]), 0), 0, 0);
keybd_event(96+strtoint(str[j]), MapVirtualKey(96+strtoint(str[j]), 0), 2, 0);
j:=j+1;
end;
keybd_event(VK_MENU, MapVirtualKey(VK_MENU, 0), KEYEVENTF_KEYUP, 0);
end
else begin
keybd_event(VkKeyScan(text[i]),0,0,0);
keybd_event(VkKeyScan(text[i]),0,2,0);
end;
Inc(i);
end;
end;
https://github.com/WladiD/SendInputHelper г-на Вальдемара Дерра.
Простой и универсальный , выберите 2 .
Пример:
uses
..., SendInputHelper;
procedure TForm1.Button1Click(Sender: TObject);
var
SIH: TSendInputHelper;
begin
SIH := TSendInputHelper.Create;
try
// Start command shell
SIH.AddShortCut([ssWin], 'r'); // Win+R
SIH.AddDelay(100);
SIH.AddText('cmd', True); // Second parameter True means AppendReturn
SIH.AddDelay(500);
SIH.AddText('ping google.de', True); // Perform a ping.
SIH.Flush; // Isn't it easy?
finally
SIH.Free;
end;
end;