免責事項:
そのまま質問に答えているわけではありません。仮想キーボードが必要な場合に、むしろ従う方法を提案しようとしています。
1.既製のコンポーネントはどうですか?
TTouchKeyboard
仮想キーボードを表す VCL コンポーネントであるコンポーネントを使用することをお勧めします。つまり、すでに Delphi ディストリビューションの一部となっているものを開発しているということです。バージョン 2010 以降の Delphi の一部ですが、どのディストリビューションに含まれているかはわかりません。
2. 見栄えが悪いので、自分で作成します。
TTouchKeyboard
コンポーネントを初めて見たとき、所有者が描画できることを望んでいました。残念ながらそうではありません。その場合、近いうちにまたは後で使用する可能性のある別のコンポーネントでこのようなケースを解決するのではなく、キーストロークを自分でシミュレートしようとします。
2.1. 独自の方法でキーストロークをシミュレートする方法は?
次のコードは、関数を使用してキーストロークをシミュレートします。これは、コンポーネントSendInput
で使用されるコードに基づいています。TTouchKeyboard
type
TKeyState = (ksDown, ksUp);
function SendInputKey(AVirtualKey: Integer; AScanCode: Integer;
AKeyState: TKeyState): Boolean;
var
Input: TInput;
begin
Input.Itype := INPUT_KEYBOARD;
if (AVirtualKey = -1) and (AScanCode >= 0) then
begin
Input.ki.wVk := MapVirtualKey(AScanCode, MAPVK_VSC_TO_VK);
Input.ki.wScan := AScanCode;
end
else if (AVirtualKey >= 0) and (AScanCode = -1) then
begin
Input.ki.wVk := AVirtualKey;
Input.ki.wScan := MapVirtualKey(AVirtualKey, MAPVK_VK_TO_VSC);
end
else if (AVirtualKey >= 0) and (AScanCode >= 0) then
begin
Input.ki.wVk := AVirtualKey;
Input.ki.wScan := AScanCode;
end;
case AKeyState of
ksDown: Input.ki.dwFlags := 0;
ksUp: Input.ki.dwFlags := KEYEVENTF_KEYUP;
end;
Result := SendInput(1, Input, SizeOf(TInput)) = 1;
end;
そして、上記の関数の使い方。この関数には、仮想キー、スキャン コード、またはその両方を渡すことができます。いずれかが不明な場合は、-1 の値を渡すと、キー コードが関数によって追加でマップされMapVirtualKey
ます。次の例は、 を送信してから を送信する方法を示していBackspaceますShift + A。
procedure TForm1.SpeedButton1Click(Sender: TObject);
begin
SendInputKey(VK_BACK, -1, ksDown);
SendInputKey(VK_BACK, -1, ksUp);
SendInputKey(VK_SHIFT, -1, ksDown);
SendInputKey(Ord('A'), -1, ksDown);
SendInputKey(Ord('A'), -1, ksUp);
SendInputKey(VK_SHIFT, -1, ksUp);
end;
2.2. 禁止された方法でキーストロークをシミュレートする方法は?
また、参照に逆らってSendKey
fromVcl.Touch.Keyboard
ユニットを使用することもできます。参照には、SendKey
は内部で使用され、呼び出されるべきではないと記載されていますが、ユニットの外部で表示されます。大胆な場合は、次のように使用できます。
uses
Vcl.Touch.Keyboard, Vcl.Touch.KeyboardTypes;
procedure TForm1.SpeedButton1Click(Sender: TObject);
var
KeyData: TKeyData;
begin
KeyData := VKey(VK_BACK, -1);
SendKey(KeyData, ksDown);
SendKey(KeyData, ksUp);
KeyData := VKey(VK_SHIFT, -1);
SendKey(KeyData, ksDown);
KeyData := VKey(Ord('A'), -1);
SendKey(KeyData, ksDown);
SendKey(KeyData, ksUp);
KeyData := VKey(VK_SHIFT, -1);
SendKey(KeyData, ksUp);
end;
2.3. 別のビューでキーストロークをシミュレートする方法は?