Я создал приложение Delphi VCL с одним элементом управления TMemo, и это код, который у меня есть.
Я использую его для обнаружения Ctrl+somekey. Например, когда я нажимаю Ctrl+x, появляется предупреждение ctrl
, а эффект Ctrl+x (обрезка) отменяется.
function IsKeyDown(Key: Integer): Boolean;
begin
Result := (GetAsyncKeyState(Key) and (1 shl 15) > 0);
end;
procedure TForm1.Memo1KeyPress(Sender: TObject; var Key: Char);
begin
if IsKeyDown(VK_CONTROL) then
begin
ShowMessage('ctrl');
Key := #0;
end;
end;
Однако, когда я немного изменил его на это:
function IsKeyDown(Key: Integer): Boolean;
begin
Result := (GetAsyncKeyState(Key) and (1 shl 15) > 0);
end;
procedure TForm1.Memo1KeyPress(Sender: TObject; var Key: Char);
begin
if IsKeyDown(VK_CONTROL) and IsKeyDown(VK_MENU) then
begin
ShowMessage('ctrl+alt');
Key := #0;
end;
end;
Это больше не работает. Что мне нужно, так это обнаруживать такие комбинации, как Ctrl+Alt+f. Я знаю, что могу использовать TActionList, но я просто хочу знать, почему мой код не работает.
@KenWhite По моему тестированию, кажется, что в обработчике событий «нажатие клавиши и продолжение» он не может отменить событие клавиши. Это правда?
Нет это не правда. Вы можете установить Key := 0;
для сброса (отмены) ключа в любом случае. Ключ определяется как var Key: Word
в определении процедуры.
Смотрите ответ, который я только что опубликовал. Кроме того, мы не можем получить ваш код откуда-то еще. Вся необходимая информация должна быть здесь, в самом вопросе.
Вместо этого вы должны использовать OnKeyDown
, который предоставляет вам как значение ключа, так и ключи-модификаторы. В приведенном ниже коде я продемонстрировал, как захватить как одну клавишу-модификатор, так и несколько клавиш-модификаторов.
uses
{ Needed for virtual key codes in recent Delphi versions. }
System.UITypes;
procedure TForm1.Memo1KeyDown(Sender: TObject; var Key: Word;
Shift: TShiftState);
begin
if (Key = vkX) and ([ssCtrl] = Shift) then
begin
Key := 0;
ShowMessage('Got Ctrl+X');
end
else if (Key = vkZ) and ([ssCtrl, ssAlt] = Shift) then
begin
Key := 0;
ShowMessage('Got Ctrl+Alt+Z');
end;
end;
Спасибо за Ваш ответ. Я проверил ваш код и обнаружил, что когда я выбираю текст в TMemo и нажимаю Ctrl+x, я получаю сообщение Got Ctrl+X
, но выделение обрезается и исчезает. Кажется, утверждение Key := 0;
не действует, верно?
Это обрабатывается другим сообщением (WM_CUT), потому что это пункт меню в контекстном меню по умолчанию (щелчок правой кнопкой мыши) для элемента управления памяткой. Вам также нужно будет перехватить это сообщение (но это отдельный вопрос, который должен быть в новом посте). К вашему сведению, есть также сообщения WM_COPY и WM_PASTE, которые также используются для комбинаций клавиш Ctrl+C и Ctrl+V.
Вместо этого используйте
OnKeyDown
илиOnKeyUp
, что дает вам как фактическую нажатую клавишу, так и клавиши-модификаторы (Ctrl, Alt, Shift).