以编程方式模拟用户输入的简单方法是什么?

yhuiod9q  于 2022-10-16  发布在  其他
关注(0)|答案(3)|浏览(164)

我有一个由于错误情况而弹出的对话框。我希望对话框保持打开状态至少30秒,并在收到最后一次用户输入(鼠标或键盘)后关闭30秒。
我可以通过检查GetLastInputInfo返回的值并在30秒前关闭对话框来实现这一点,但如果在用户30秒没有使用鼠标或键盘时弹出对话框,GetLastInputInfo测试将立即通过,并且对话框将立即再次关闭。我可以用另一个定时器来做这件事,但我想,在对话框打开之前,模拟鼠标被稍微移动一下,或者发出一个(无害的)按键,会简单得多。据推测,它还有一个优势,那就是将系统踢出屏幕保护程序。
实现这一点的最简单的1行Delphi代码片段是什么?

mitkmikd

mitkmikd1#

最简单的是使用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;
hsgswve4

hsgswve42#

使用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;
agyaoht7

agyaoht73#

作者:Waldemar Derr先生。

简单多功能,选择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;

相关问题