1

こんにちは、ビジュアルベーシックデルファイでクラシックをやろうとしていSendKeys ('hello world');ますが、それができないことがわかりました。

誰も方法を知っていますか?

4

3 に答える 3

6

Win32 APIkeybd_event()SendInput()関数を見てください。どちらの関数も Delphi のWindowsユニットで宣言されています。

例えば:

uses
  Windows;

procedure SendKeys(const S: String);
var
  I: Integer;
begin
  for I := 1 to Length(S) do
  begin
    // keybd_event() does not support Unicode, so you should use SendInput() instead...
    keybd_event(S[I], MapVirtualKey(S[I], 0),0, 0);
    keybd_event(S[I], MapVirtualKey(S[I], 0), KEYEVENTF_KEYUP, 0);
  end;
end;

uses
  Windows;

{$POINTERMATH ON}
procedure SendKeys(const S: String);
var
  InputEvents: PInput;
  I, J: Integer;
begin
  if S = '' then Exit;
  GetMem(InputEvents, SizeOf(TInput) * (Length(S) * 2));
  try
    J := 0;
    for I := 1 to Length(S) do
    begin
      InputEvents[J].Itype := INPUT_KEYBOARD;
      InputEvents[J].ki.wVk := 0;
      InputEvents[J].ki.wScan := Ord(S[I]);
      InputEvents[J].ki.dwFlags := KEYEVENTF_UNICODE;
      InputEvents[J].ki.time := 0;
      InputEvents[J].ki.dwExtraInfo := 0;
      Inc(J);
      InputEvents[J].Itype := INPUT_KEYBOARD;
      InputEvents[J].ki.wVk := 0;
      InputEvents[J].ki.wScan := Ord(S[I]);
      InputEvents[J].ki.dwFlags := KEYEVENTF_UNICODE or KEYEVENTF_KEYUP;
      InputEvents[J].ki.time := 0;
      InputEvents[J].ki.dwExtraInfo := 0;
      Inc(J);
    end;
    SendInput(J, InputEvents[0], SizeOf(TInput));
  finally
    FreeMem(InputEvents);
  end;
end;
于 2013-10-31T00:06:14.387 に答える
2

以下は、私が過去にやらなければならなかったいくつかの自動化プロジェクトで使用するために組み立てた関数の一部です。彼らは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<TKeyInfo>;
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;
于 2013-10-31T00:25:28.723 に答える