一部のアクションにショートカットキーを使用して、DelphiTActionListを使用しています。
キーボードの自動リピートによって特定のアクションが複数回トリガーされないようにしたいのですが、自動リピートの動作にグローバルに影響を与えたくありません。これを行うための最良の方法は何ですか?
明確化:私はまだ複数の高速キー押下を処理する必要があります-無視したいのは自動リピートによって生成されたキー押下だけです。
一部のアクションにショートカットキーを使用して、DelphiTActionListを使用しています。
キーボードの自動リピートによって特定のアクションが複数回トリガーされないようにしたいのですが、自動リピートの動作にグローバルに影響を与えたくありません。これを行うための最良の方法は何ですか?
明確化:私はまだ複数の高速キー押下を処理する必要があります-無視したいのは自動リピートによって生成されたキー押下だけです。
WM_KEYDOWNメッセージを傍受し、ビット 30 を調べて、自動繰り返しかどうかを確認します。そうである場合は、通常どおりメッセージを渡さないでください。メッセージは表示されません。
これを機能させるには、フォーム キー プレビューを有効にする必要がある場合があります。
TTimer を削除し、TTimer.Interval を必要な値 (1000 = 1 秒) に設定してから、TActionList で次のようにします。
procedure TfrmMain.ActionList1Execute(Action: TBasicAction; var Handled: Boolean);
begin
if Timer1.Enabled then
begin
Handled := True;
Exit;
end;
Handled := false;
Timer1.Enabled := true;
end;
また、 Timer.OnTimerでタイマーを無効にすることを忘れないでください。
アクションが最後に使用された時間を保存し、その間の時間が短すぎる場合は無視できます。単一のアクションの場合、次のように実行できます。
procedure TForm.FormCreate(const Sender: TObject);
begin
// ...
FLastActionTime := Now; //
end;
proceudure TForm.Action1Execute(const Sender: TObject);
const
cThreshold = 1/(24*60*60*10); // 0.1 sec
begin
if Now-FLastActionTime<cThreshold then
Exit; // Ignore two actions within 0.1 sec
FLastActionTime := Now;
end;
これをdmajkicのソリューションと組み合わせて、より一般的なアプローチを得ることができます。そして、あなたが本当に野心的であるならば、あなたはTAction/TActionlistの新しいバージョンを作成することができます。