SendKeys in Delphi 2010

前端 未结 3 1940
面向向阳花
面向向阳花 2020-12-20 08:17

Hi I\'m trying to do the classic SendKeys (\'hello world\'); was done in visual basic delphi but I discovered that you can not do that.

Does anyone know

3条回答
  •  夕颜
    夕颜 (楼主)
    2020-12-20 08:42

    Here are some of the functions I've assembled to use in some automation projects I had to do in past. They utilize keybd_event() API.

    procedure SendKeys(const AString: String; const AAmount: Integer = 1);
    const
      TReadableChars = [32..126];
      TShiftChars    = [33..43, 58, 60, 62..90, 94..95, 123..126];
    type
      TKeyInfo = record
                   AsChar  : Char;
                   AsOrd   : Integer;
                   VK      : Integer;
                   SC      : Integer;
                   UseShift: Boolean;
                 end;
      TKeys    = TList;
    var
      key   : TKeyInfo;
      keys  : TKeys;
      C1, C2: Integer;
    begin
      keys := TKeys.Create;
      try
        for C1 := 1 to Length(AString) do
        begin
          key.AsChar := AString[C1];
          key.AsOrd := Ord(key.AsChar);
    
          if key.AsOrd in TReadableChars then
          begin
            key.VK := VkKeyScan(key.AsChar);
            key.UseShift := key.AsOrd in TShiftChars;
            key.SC := MapVirtualKey(key.VK, 0);
            keys.Add(key);
          end;
        end;
    
        for C1 := 1 to AAmount do
          for C2 := 0 to keys.Count - 1 do
          begin
            key := keys[C2];
    
            if key.UseShift then
              keybd_event(VK_SHIFT, 0, 0, 0);
    
            keybd_event(key.VK, key.SC, 0, 0);
            keybd_event(key.VK, key.SC, KEYEVENTF_KEYUP, 0);
    
            if key.UseShift then
              keybd_event(VK_SHIFT, 0, KEYEVENTF_KEYUP, 0);
          end;
      finally
        keys.Free;
      end;
    end;
    
    procedure SendKey(const AVKCode: Integer; const AAmount: Integer = 1);
    var
      C1: Integer;
    begin
      for C1 := 1 to AAmount do
      begin
        keybd_event(AVKCode, 0, 0, 0);
        keybd_event(AVKCode, 0, KEYEVENTF_KEYUP, 0);
      end;
    end;
    

提交回复
热议问题