Delphi: Как мне остановить автоматическое повторение клавиш быстрого вызова TAction?
Я использую Delphi TActionList с сочетаниями клавиш для некоторых действий.
Я хочу, чтобы определенные действия не запускались несколько раз с помощью автоповтора клавиатуры, но я не хочу влиять на работу автоповтора глобально. Какой лучший способ сделать это?
Пояснение: мне все еще нужно обрабатывать несколько быстрых нажатий клавиш - это только нажатия клавиш, генерируемые автоматическим повторением, которые я хочу игнорировать.
3 ответа
Перехватите сообщения 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.