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(). Это решит проблему.

Другие вопросы по тегам