こんにちは、ビジュアルベーシックデルファイでクラシックをやろうとしていSendKeys ('hello world');
ますが、それができないことがわかりました。
誰も方法を知っていますか?
こんにちは、ビジュアルベーシックデルファイでクラシックをやろうとしていSendKeys ('hello world');
ますが、それができないことがわかりました。
誰も方法を知っていますか?
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;
以下は、私が過去にやらなければならなかったいくつかの自動化プロジェクトで使用するために組み立てた関数の一部です。彼らは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;