Как сохранить дочернюю форму поверх всего, но родитель не должен быть?

Я видел несколько сообщений, похожих на этот вопрос, но в этом есть небольшая разница. У меня есть программа, пользовательский интерфейс которой может находиться за другими программами, но у нее есть дочерняя форма, которая отображается в верхнем левом углу и отображает результаты. Эта часть монитора дублируется и отображается для общего доступа. "табло". Я хочу, чтобы эта форма "результатов" стояла на вершине всего (Taskmanager в порядке, я могу жить с этим). Любые другие приложения, которые будут запущены, не будут пытаться подняться на вершину, например, "Word", "IE", "Excel" и т. Д.

Если я устанавливаю родительский "SetWindowPos" в "TopMost", а дочерний также в "TopMost", оба моих окна находятся сверху, однако форма пользовательского интерфейса также располагается поверх чего угодно. Если пользователю необходимо запустить другое приложение, наша форма будет размещена поверх него, что сделает другое приложение непригодным для использования, однако оно будет находиться в форме результатов. Мы не можем использовать таймер, чтобы переместить его наверх, так как он будет закрыт, пока таймер не сработает, это не может произойти.

Если я только установлю форму результатов на самый верхний уровень, она не останется на вершине всего. Похоже, что родитель тоже должен быть верхом? Есть ли способ обойти это и сделать ребенка сверху, а его родитель может сидеть ниже? Или родитель должен быть наивысшим, чтобы дети тоже были наивысшими? Родитель не может сидеть над ребенком, когда я хватаю событие перемещения и не позволяю ему переместиться через ребенка.

Я программирую на Delphi, поэтому любые ответы были бы лучше всего на Delphi, но все, что более общего, вполне нормально, я думаю, что в любом случае это будет вызов Windows.

Спасибо

1 ответ

Если я вас правильно понимаю, ваша программа имеет основную форму (MainForm) и форма результатов (ResultsForm) и, возможно, некоторые другие тоже, но они должны "вести себя" нормально.

MainForm также должен вести себя нормально, то есть переходить в фоновый режим, если активированы другие приложения, но ResultsForm всегда должен оставаться поверх всех других форм, в том числе других приложений.

Следующее проверено только в Windows 7, поэтому может работать или не работать с другими ОС. Я позже сегодня буду тестировать с Windows 10.

Сначала откомментируйте все предыдущие попытки, которые могут помешать. Покидать MainForm.FormStyle по умолчанию fsNormal, Задавать ResultsForm.FormStyle в fsStayOnTop,

Затем добавьте TApplicationEvents в ResultsForm и добавить обработчик события для OnDeactivate:

procedure TResultsForm.ApplicationEvents1Deactivate(Sender: TObject);
begin
  SetForegroundWindow(Handle);
end;

ResultsForm теперь будет оставаться поверх других окон, а также других приложений.

Предостережение: если вы запускаете второй экземпляр (или если какое-то другое приложение выполняет тот же трюк), вы окажетесь в цикле, где приложения борются за то, чтобы быть на вершине.

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