イベントonKeyDown
やonKeyUp
. 2 つのキーだけを押すと、プログラムは完全に機能します。
2 つ以上のキーの組み合わせの場合、2 つのキーが既に押されている (つまり、それらが押されている) 場合、別のキーの圧力は捕捉されないため、FGH の組み合わせは別の点字記号に対応する FG と見なされます。
さらに、3 つ以上のキーを同時に押すと、onKeyDown
捕捉されるイベントの数が常に同じになるとは限りません。
イベントonKeyDown
やonKeyUp
. 2 つのキーだけを押すと、プログラムは完全に機能します。
2 つ以上のキーの組み合わせの場合、2 つのキーが既に押されている (つまり、それらが押されている) 場合、別のキーの圧力は捕捉されないため、FGH の組み合わせは別の点字記号に対応する FG と見なされます。
さらに、3 つ以上のキーを同時に押すと、onKeyDown
捕捉されるイベントの数が常に同じになるとは限りません。
安価なキーボードにはトラブルがつきもの!ここに、キーボードをテストするための簡単なテスト プログラムがあります。(フォームの OnKeyDown および OnKeyUp イベントを定義することを忘れないでください。)
type
TForm8 = class(TForm)
procedure FormKeyDown(Sender: TObject; var Key: Word; Shift: TShiftState);
procedure FormKeyUp(Sender: TObject; var Key: Word; Shift: TShiftState);
private
{ Private declarations }
public
{ Public declarations }
end;
var
Form8: TForm8;
implementation
{$R *.dfm}
procedure TForm8.FormKeyDown(Sender: TObject; var Key: Word; Shift: TShiftState);
var
State :TKeyboardState;
n :integer;
s :string;
begin
GetKeyboardState(State);
s := '';
for n := Low(byte) to High(byte) do
if State[n] and 128 <> 0 then
s := s + 'VK(' + IntToStr(n) + ') ';
Caption := s;
end;
procedure TForm8.FormKeyUp(Sender: TObject; var Key: Word; Shift: TShiftState);
var
State :TKeyboardState;
n :integer;
s :string;
begin
GetKeyboardState(State);
s := '';
for n := Low(byte) to High(byte) do
if State[n] and 128 <> 0 then
s := s + 'VK(' + IntToStr(n) + ') ';
Caption := s;
end;
end.
GetKeyboardStateを使用すると、各キーの状態の完全な配列を取得できます。点字記号のような複数のキー押下をキャッチするには、非常に短い間隔の TTimer から、または TThread を継承するクラスからなど、高い順序で呼び出す必要があります。また、2 つ以上のボタンが押される可能性があります。キーダウンはすべてのキーに同時に登録されるわけではありません。最長。
GetAsyncKeyStateを使用します。キーの現在の状態を返すだけでなく、最後の呼び出し以降にキーが押されたかどうかも返します。同時に押すことができるキーの数には制限があります。8キー程度が限界かと思いますが、ハードウェアやドライバ、OSのバージョンによって異なる場合があります。