2013-02-17 3 views
6

Я хочу, чтобы обнаружить нажатие 3 ключа в моей форме, например Ctrl +C + N ... набранный форму мне нужно обнаружить всегда начинается с Ctrl и далее идут две буквы.Delphi - Обнаружение нажатия 3 клавиши одновременно

Как я это делаю?

+0

Используйте 'TActionManager' –

+0

@Jerry, что не поможет –

+0

@David Ahh ограничения от нескольких буквенных клавиш? –

ответ

16

По прибытии одного из ключей вы можете посмотреть, был ли другой ключ уже выключен. Например .:

procedure TForm1.FormKeyDown(Sender: TObject; var Key: Word; 
    Shift: TShiftState); 
begin 
    if Shift = [ssCtrl] then begin 
    case Key of 
     Ord('C'): 
     if (GetKeyState(Ord('N')) and $80) = $80 then 
      ShowMessage('combo'); 
     Ord('N'): 
     if (GetKeyState(Ord('C')) and $80) = $80 then 
      ShowMessage('combo'); 
    end; 
    end; 
end; 


Однако это будет также обнаружить, например N + Ctrl + C, последовательность, которая не начинается с ключа Ctrl. Если это не относится к действительной комбинации клавиш, вы можете сохранить немного ключевой истории с помощью флага. Далее следует обнаружить только последовательности, которые изначально начинается с Ctrl:

type 
    TForm1 = class(TForm) 
    procedure FormKeyDown(Sender: TObject; var Key: Word; Shift: TShiftState); 
    procedure FormKeyUp(Sender: TObject; var Key: Word; Shift: TShiftState); 
    private 
    FValidKeyCombo: Boolean; 
    end; 

... 

procedure TForm1.FormKeyDown(Sender: TObject; var Key: Word; 
    Shift: TShiftState); 
begin 
    if FValidKeyCombo and (Shift = [ssCtrl]) then 
    case Key of 
     Ord('C'): 
     if (GetKeyState(Ord('N')) and $80) = $80 then 
      ShowMessage('combo'); 
     Ord('N'): 
     if (GetKeyState(Ord('C')) and $80) = $80 then 
      ShowMessage('combo'); 
    end; 
    FValidKeyCombo := (Shift = [ssCtrl]) and (Key in [Ord('C'), Ord('N')]); 
end; 

procedure TForm1.FormKeyUp(Sender: TObject; var Key: Word; Shift: TShiftState); 
begin 
    FValidKeyCombo := False; 
end; 
+1

Хорошее редактирование, я не думал об этом. –

+0

@Jerry - я тоже не был :), пока не попробовал код ... –

+0

Я обнаружил, что если я хочу, чтобы Ctrl + C + N отвечал в том же порядке, я должен использовать 'N' с ключом 'case ' и тест 'C' с 'GetKeyState' ... почему это поведение? – Wel

4

Существует более простой способ:

procedure TForm1.FormKeyDown(Sender: TObject; var Key: Word; Shift: TShiftState); 
    begin 
     If (GetKeyState(Ord('Q'))<0) and (GetKeyState(Ord('N'))<0) and (GetKeyState(VK_CONTROL)<0) 
      Then ShowMessage('You did it :)'); 
    End; 
+0

Вы не будете знать, будет ли первая нажатая клавиша «ctrl» или одна из других. Кроме того, это будет по-прежнему соответствовать, когда вы нажимаете совершенно другой ключ после того, как вы нажали три из них. –

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