Основная форма приложения Delphi: временное перемещение вперед

У нас есть приложение Delphi 2007 и недавно включила процедуру TBaseForm . CreateParams ( var Params : TCreateParams ); begin inherited CreateParams ( Params ); Парамс . ExStyle : = Params . ExStyle или WS _ EX _ APPWINDOW ; Парамс . WndParent : = 0 ; конец ; для лучшей поддержки Windows Aero. Однако из-за того, что основная форма не попадает в верхнюю часть всех дочерних форм при нажатии, мы добавили следующий код.

SetFocus

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

Кто-нибудь еще испытал это поведение и может посоветовать обходное решение.

благодаря

user-interface,delphi,hotkeys,aero,

4

Ответов: 1


5 принят

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

Активация основной формы происходит при CM_APPSYSCOMMANDвызове в ручке основной формы, а «Приложение» обрабатывает WM_SYSCOMMANDсообщение, которое отправляется из SC_KEYMENUобработчика «WinControl» (вторичная форма), когда тип команды MainFormOnTaskBar(активирование окна меню - Alt ключ).

Обратите внимание, что это поведение не является побочным эффектом использования, CreateParamsа затем переопределяет MainFormOnTaskBarформы, которые могут быть перенесены на передний план . Такое же поведение происходит независимо от настройки MainFormOnTaskBar. Единственное различие заключается в том, что активированная основная форма не может появляться перед вторичными формами, когда она установлена, но основная форма активируется все равно.

Вы можете перехватить, чтобы изменить поведение в нескольких местах, например, WM_SYSKEYDOWNобработчик на вторичной форме или во OnKeyDownвторичной форме. Семантически более правильное переопределение, ИМО, должно выполняться на IsShortCutвторичной форме. Как вы узнали, когда вторичная форма обрабатывает комбинацию клавиш, обработка системного ключа завершается. Затем вы можете сообщить VCL, что ваша форма требует ключа:

type
  TSecondaryForm = class(TForm)
    ..
  public
    function IsShortCut(var Message: TWMKey): Boolean; override;

...

function TSecondaryForm.IsShortCut(var Message: TWMKey): Boolean;
begin
  Result := True;
end;

Конечно, вы можете точно настроить, чтобы условно вернуть true в зависимости от параметра.

пользовательский интерфейс, Дельфы, горячие клавиши, аэродинамический,
Похожие вопросы