Улучшение поддержки Aero в Delphi 2007: проблемы переключения главного окна на foreground при использовании горячих клавиш
Разработчики, работающие с Delphi 2007, часто сталкиваются с необходимостью улучшения поддержки интерфейса Windows Aero. Одним из способов достижения этой цели является использование свойства MainFormOnTaskBar. Однако, применение данного свойства может привести к нежелательному поведению, например, к временному переключению главного окна на foreground при нажатии горячих клавиш на дочерних формах.
Проблема
При включении свойства MainFormOnTaskBar для лучшей интеграции с Windows Aero, разработчики столкнулись с проблемой, что главное окно не переходит на передний план при клике по нему. В качестве решения было добавлено следующее изменение в метод CreateParams:
procedure TBaseForm.CreateParams(var Params: TCreateParams);
begin
inherited CreateParams(Params);
Params.ExStyle := Params.ExStyle or WS_EX_APPWINDOW;
Params.WndParent := 0;
end;
Однако это привело к побочному эффекту: при нажатии горячих клавиш (Alt + ключ) на дочерних формах, которые не обрабатывают эти комбинации, главное окно мигает на переднем плане, а затем снова скрывается. Если же комбинация клавиш обрабатывается, такого поведения не наблюдается.
Решение
Проблема заключается в поддержке акселераторов VCL для возможного главного меню на главной форме. При активации главного меню происходит вызов SetFocus на главной форме, что приводит к её временному переключению на передний план. Это поведение не зависит от использования MainFormOnTaskBar и переопределения CreateParams, а является стандартным функционированием VCL.
Для изменения поведения можно перехватить обработку событий в различных точках, например, в обработчике WM_SYSKEYDOWN на дочерней форме или в OnKeyDown. Однако более корректным решением будет переопределение метода IsShortCut на дочерней форме:
type
TSecondaryForm = class(TForm)
...
public
function IsShortCut(var Message: TWMKey): Boolean; override;
...
end;
function TSecondaryForm.IsShortCut(var Message: TWMKey): Boolean;
begin
Result := True;
end;
Переопределение IsShortCut позволяет сообщить VCL, что форма обрабатывает нажатие клавиш, и предотвратить временное переключение главного окна на передний план.
Заключение
При работе с Delphi 2007 и использовании MainFormOnTaskBar для улучшения поддержки Windows Aero важно учитывать особенности поведения VCL. Переопределение методов, таких как IsShortCut, позволяет контролировать поведение программы и избегать нежелательного переключения окон.
Разработчики столкнулись с проблемой переключения главного окна приложения на передний план при использовании горячих клавиш на дочерних формах после включения свойства `MainFormOnTaskBar` для интеграции с Windows Aero в Delphi 2007.
Комментарии и вопросы
Получайте свежие новости и обновления по Object Pascal, Delphi и Lazarus прямо в свой смартфон. Подпишитесь на наш Telegram-канал delphi_kansoftware и будьте в курсе последних тенденций в разработке под Linux, Windows, Android и iOS