Delphi XE2: Как предотвратить кражу фокуса клавишей Alt?
Когда курсор находится, например, в поле редактирования, нажатие и отпускание клавиши Alt (без нажатия какой-либо другой клавиши) приводит к тому, что поле редактирования теряет фокус. Это происходит также с любым другим сфокусированным контролем. Как это можно предотвратить в программе Delphi для какого-либо сфокусированного управления?
2 ответа
Лучший способ сделать это с меньшими непредвиденными последствиями - это быть предельно точным - я бы предложил:
В вашей форме переопределите WndProc:
TForm1 = class(TForm)
Edit1: TEdit;
private
FSuppress : boolean;
protected
procedure WndProc(var Message : TMessage); override;
end;
И реализовать так:
procedure TForm1.WndProc(var Message : TMessage);
begin
if (Message.Msg = WM_SYSCOMMAND) and
(Message.WParam = SC_KEYMENU) and
FSuppress then Exit;
inherited WndProc(Message);
end;
Это сообщение Windows для системной команды и конкретного WParam, которое указывает, что оно предназначено для извлечения меню, вызванного нажатием клавиши. Задавать FSuppress
на любые элементы управления, которые вы хотите сохранить фокус:
procedure TForm1.Edit1Enter(Sender: TObject);
begin
FSuppress := true;
end;
procedure TForm1.Edit1Exit(Sender: TObject);
begin
FSuppress := false;
end;
Это не отключит клавишу ALT, но отключит, в частности, активацию меню во время Edit1
имеет фокус. Критически, ярлыки как ALT + F4
выйти из программы или ALT+TAB
переключать окна все равно будет работать.
Однако я согласен с большинством комментариев в том, что это, вероятно, не лучшее решение для ЖК-дисплея вашей пользовательской базы. Вы по сути наносите вред программе для компетентных пользователей, чтобы потворствовать ошибкам некомпетентных. Возможно, сделайте эту опцию, например, липкие клавиши Windows или опции доступности для людей с ограниченными возможностями.
procedure SendKey_ALT;
begin
keybd_event(VK_MENU, MapVirtualKey(VK_MENU, 0), 0, 0);
keybd_event(VK_MENU, MapVirtualKey(VK_MENU, 0), KEYEVENTF_KEYUP, 0);
end;
Вызовите указанную выше процедуру в своем методе FormCreate(). Это решит проблему.