Наблюдаемое поведение является результатом поддержки ускорителя 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 в зависимости от параметра.