用WinAPI在Delphi中模拟键盘输入

kuhbmx9i  于 2022-10-16  发布在  其他
关注(0)|答案(2)|浏览(246)

我需要以编程方式将一个字符输入到Delphi网格的单元格中(在其他应用程序中)。
要手动执行此操作,需要执行以下步骤:
1.按F3键。
1.按向右箭头键3次。
1.按空格键。
1.在键盘上输入字母‘E’。
1.按向右箭头键。

// Press F3 button         
 keybd_event(VK_F3, 0, 0, 0);         
 // Press right arrow key 3 times
 keybd_event(VK_RIGHT, 0, 0, 0);
 keybd_event(VK_RIGHT, 0, 0, 0);
 keybd_event(VK_RIGHT, 0, 0, 0);

 // Press the space button
 keybd_event(VK_SPACE, 0, 0, 0);

 // Type letter E
 keybd_event(Ord('E'), 0, 0, 0);

 // Move to the right
 keybd_event(VK_RIGHT, 0, 0, 0);

但这并不管用。当我运行这段代码时,似乎什么都没有发生。
我应该如何修改这段代码,使其真正模拟用户输入?

cgh8pdjw

cgh8pdjw1#

每次按键都是先按下一次键,然后再按一次向上键。因此,每次按键都需要两次调用keybd_event。例如,要按F3:

keybd_event(VK_F3, 0, KEYEVENTF_KEYDOWN, 0);
keybd_event(VK_F3, 0, KEYEVENTF_KEYUP, 0);

请注意,KEYEVENTF_KEYDOWN实际上不是由Windows头文件或Delphi转换定义的。将其定义为0。不过,这会使代码更清楚地写出来。
自然,您不会在代码中使用对keybd_event的成对调用。但是相反,您将把成对的调用 Package 到一个助手函数中。
在某些情况下,您可能需要指定第二个参数,即扫描码。但这通常是不必要的。

eiee3dmh

eiee3dmh2#

使用Waldemar Derr先生的https://github.com/WladiD/SendInputHelper
示例:

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;

相关问题