2009-02-02 2 views
3

Я использую Delphi TActionList с клавишами быстрого доступа для некоторых действий.Delphi: Как мне отключить клавиши быстрого доступа TAction?

Я хочу, чтобы некоторые действия срабатывали несколько раз с помощью автоматической повторной клавиатуры, но я делаю не хочу повлиять на работу автоматического повтора во всем мире. Каков наилучший способ сделать это?

Разъяснение: Я все еще нужно обрабатывать несколько быстрых нажатий клавиш - это только на нажатие клавиш, сгенерированные автоповтора, что я хочу, чтобы игнорировать.

ответ

12

Перехватите сообщения WM_KEYDOWN и посмотрите на бит 30, чтобы узнать, является ли оно автоматически повторяющимся. Если это так, просто не передавайте сообщение, как обычно, и оно не будет видно.

Возможно, вам потребуется включить форму key-preview, чтобы сделать эту работу.

2

Вы можете оставить 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.

+0

Не совсем то, что я хочу. По-прежнему важно, чтобы пользователь мог быстро разбить ключ подряд, но маны autorepeat должны быть проигнорированы. – Roddy

0

Вы можете сохранить последний раз, когда используется действие, и проигнорировать его, если промежуток времени слишком короткий. Для одного действия можно сделать так:

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.

Смежные вопросы