模拟键盘键入

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

我如何才能在TWebBrowser或TChromium中模拟真人的打字。它可以是这两个中的任何一个。

thtygnil

thtygnil1#

将需要一些适应,可能有助于进一步的发展

procedure SendKeys(sText: String);

var
 i             : Integer;
 shift         : Boolean;
 vk, scancode   : Word;
 ch            : Char;
 c, s          : Byte;
const
 vk_keys       : Array[0..9] of Byte=(VK_HOME, VK_END, VK_UP, VK_DOWN, VK_LEFT, VK_RIGHT, VK_PRIOR, VK_NEXT, VK_INSERT, VK_DELETE);
 vk_shft       : Array[0..2] of Byte=(VK_SHIFT, VK_CONTROL, VK_MENU);
 flags         : Array[FALSE..TRUE] of Integer = (KEYEVENTF_KEYUP, 0);
 C_ALTGRS = ['\','@','~','²','³','€','{','}','[',']'];

begin
 shift:=FALSE;
 for i:=1 to Length(sText) do begin
   ch:=sText[i];
     if (ch>=#250) then begin
     s:=Ord(ch)-250;
     shift:=NOT Odd(s);
     c:=vk_shft[s shr 1];
     scancode:=MapVirtualKey(c, 0);
     Keybd_Event(c, scancode, flags[shift], 0);
   end else begin
     vk:=0;
     if (ch>=#240) then
       c:=vk_keys[Ord(ch)-240]
     else if (ch>=#228) then
       c:=Ord(ch)-116
     else if (ch<#32) then
       c:=Ord(ch)
     else begin
       vk:=VkKeyScan(ch);
       c:=LoByte(vk);
     end;

     scancode:=MapVirtualKey(c, 0);

     if (sText[i] in C_AltGRS) then Keybd_Event(VK_RMENU, MapVirtualKey(VK_RMENU,0), 0, 0)
     else if (NOT shift AND (Hi(vk)>0)) then Keybd_Event(VK_SHIFT, $2A, 0, 0 );
     Keybd_Event( c, scancode, 0, 0 );
     Keybd_Event( c, scancode, KEYEVENTF_KEYUP, 0 );
     if (sText[i] in C_AltGRS) then Keybd_Event(VK_RMENU,MapVirtualKey(VK_RMENU,0), KEYEVENTF_KEYUP, 0)
     else if (NOT shift AND (Hi(vk)>0)) then Keybd_Event(VK_SHIFT, $2A, KEYEVENTF_KEYUP, 0);

   end;
   Application.ProcessMessages;
 end;
end;

procedure TForm4.FormCreate(Sender: TObject);
begin
   WebBrowser1.Navigate('http://www.google.de');

end;

procedure TForm4.SpeedButton1Click(Sender: TObject);
begin
   SendKeys('test');
   SendKeys(#13);
end;
epfja78i

epfja78i2#

这应该足以让您开始学习。

procedure EmulateKeyPress();
var
  _Input: TInput;
begin
  _Input.Itype := INPUT_KEYBOARD;
  _Input.ki.wVk := VK_SHIFT; // $31 is the VK_1
  _Input.ki.wScan := 0;
  _Input.ki.dwFlags := 0;
  _Input.ki.time := 0;
  _Input.ki.dwExtraInfo := 0;
  if SendInput(1, _Input, SizeOf(_Input)) = 0 then
  begin
    ShowMessage('Input event was Blocked');
    Exit
  end;
  _Input.ki.dwFlags := KEYEVENTF_KEYUP;
  SendInput(1, _Input, SizeOf(_Input));
end;
dojqjjoe

dojqjjoe3#

你最好的帮手正好是沃尔德马尔·德尔先生的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;

相关问题