Заставить форму оставаться поверх всего, даже когда основная форма свернута

Пытаюсь найти способ заставить одну из моих форм оставаться поверх всего остального на рабочем столе, даже когда основная форма свернута. Вроде как Google Chrome со своими небольшими уведомлениями.

Я установил стиль формы моей формы на systemStayOnTop, и это работает очень хорошо, пока я не сверну основную форму. Однако, когда я сворачиваю его, все остальное исчезает (как и должно быть, я думаю).

Итак, есть ли простой способ принудительно разместить форму поверх всего, даже если моя основная форма свернута? Или мне нужно вникать в DirectX/WinAPI?

P.S. Уже был на этом вопрос, но эти методы не сработали.

Спасибо.

ПРИМЕЧАНИЕ. Несмотря на то, что этот вопрос изначально был помечен как [delphi], он, согласно приведенным ниже комментариям, касается Lazarus. Вот почему есть ответы для Delphi.


person Michael    schedule 09.08.2017    source источник
comment
Что такое системаStayOnTop? Откуда мы знаем, что то, что мы можем предложить, будет работать, в то время как то, что вы уже попробовали, не работает?   -  person Sertac Akyuz    schedule 09.08.2017
comment
Почему бы не запретить сворачивать основную форму и позволить пользователям закрыть ее... а затем добавить кнопку на форме StayOnTop, которая показывает основную форму?   -  person John Easley    schedule 09.08.2017
comment
@SertacAkyuz, systemStayOnTop — это идентификатор переменной типа TFormStyle, которую вы устанавливаете в свойстве Form Style формы. Вот еще информация   -  person Michael    schedule 10.08.2017
comment
@SertacAkyuz, откуда мы знаем, что то, что мы можем предложить, сработает, а то, что вы уже пробовали, не работает? Я думаю, что в этом весь смысл stackoverflow. Я просто недостаточно опытен в этой области и не знаю всех возможных техник, которые можно применить в данной ситуации. Я просто сделал основные вещи, которые были в пределах моей досягаемости. Может быть, люди, которые работали в этой области, могут мне помочь.   -  person Michael    schedule 10.08.2017
comment
@Michael - Это ссылка на документацию по lazarus, а не на delphi, где нет systemStayOnTop. Пожалуйста, отметьте свой вопрос правильно.   -  person Sertac Akyuz    schedule 10.08.2017
comment
Вы должны быть в состоянии увидеть мою точку зрения. Вы пробовали предложения от других, которые не сработали, и о которых сообщалось, что они сработали. Какие у вас есть гарантии, что наше предложение сработает? Вы должны предоставить минимальный воспроизводимый пример, и тогда мы сможем увидеть, что не получается и как.   -  person Sertac Akyuz    schedule 10.08.2017
comment
Lazarus ‹› Delphi, когда дело доходит до свойств формы. В Delphi нет TFormStyle.systemStayOnTop. Пометка Delphi тратит время людей, которые отвечают на него только для того, чтобы узнать, что вы вообще не используете Delphi.   -  person Ken White    schedule 10.08.2017
comment
Реально извините за путаницу с тегами, ребята. К счастью, это было отредактировано. Я попытаюсь разобраться с этим позже.   -  person Michael    schedule 11.08.2017


Ответы (3)


Вы можете заставить форму оставаться наверху, установив для параметра FormStyle значение fsStayOnTop, а также сделав ее окном верхнего уровня и установив соответствующий стиль окна. Вы можете сделать это, переопределив CreateParams в своей форме:

TForm1 = class(TForm)        
  private
    { Private declarations }
  protected      
    procedure CreateParams(var Params: TCreateParams); override;
  public
    { Public declarations }
end;

реализация :

procedure TForm1.CreateParams(var Params: TCreateParams);
begin
  inherited;
  Params.WndParent := 0;  { Make this a top-level window }
  Params.Style := WS_POPUPWINDOW or WS_CAPTION or WS_CLIPCHILDREN;
end;
person J...    schedule 09.08.2017
comment
Хай Джей, спасибо за ответ! К сожалению, я использую Lazarus, и оказалось, что процедура CreateParams отсутствует в родительском классе. - person Michael; 10.08.2017
comment
@MichaelNaifield Ну, почему вы пометили это как Delphi, если хотите получить ответ для Lazarus? Добавьте LclType в предложение использования, определение для TCreateParams, вероятно, отсутствует. - person J...; 10.08.2017
comment
@MichaelNaifield Лазарь также делает глупости в TWin32WSCustomForm.CreateHandle в Win32WSForms, где он заставляет родителя, даже если вы говорите ему, что не хотите этого. Вы можете либо повторно реализовать это, либо изменить исходный код Lazarus, чтобы сделать что-то разумное. Этот ответ работает в Delphi. - person J...; 10.08.2017
comment
Верх невежливости ждать, пока мы приложим усилия, чтобы ответить на заданный вами вопрос, прежде чем сказать нам, что вы упустили из вопроса наиболее важные детали. Здесь нет ничего несчастного. Это просто неаккуратно. Убедитесь, что вы задаете правильный вопрос. Не спешите. - person David Heffernan; 10.08.2017

Я попробовал решение CreateParams, опубликованное выше — в Delphi 10.3.3 — и оно не сработало. Однако я нашел решение, которое работает для Delphi. Не знаю, есть ли что-то подобное в Lazarus, но я публикую здесь ответ Delphi на случай, если кто-то еще столкнется с этим, поскольку я нашел этот пост за 30 минут до того, как нашел сработавший ответ Delphi. :)

Поместите это в событие Form B OnCreate:

Стиль формы:= fsStayOnTop;

но одного этого мало...

Перетащите TApplicationEvents в форму B.

В событии OnDeactivate для ApplicationEvents1 добавьте следующее:

SetForegroundWindow(Handle);

Я слежу за небольшим окном состояния, в то время как моя основная форма обрабатывает данные за пределами сайта. Красиво работает!

person Mad Martian    schedule 30.08.2020

В дополнение к сообщению @J... вы можете использовать процедуру OnDeactivate из класса TForm, чтобы заставить пользователя не свободный фокус из окна.

При создании и отображении формы вы также можете использовать ShowModal вместо Show, чтобы окно отображалось поверх родителя.

person André Paul Grandsire    schedule 09.08.2017
comment
Я никогда не звоню Show. Моя форма всегда видна, я alphaBlendValue увеличиваю/уменьшаю ее яркость с помощью таймеров, чтобы показать ее. - person Michael; 10.08.2017
comment
Вы уже протестировали onActivate событие? Он должен запускаться, когда ваша форма завершает альфа-версию. Это решение основано на жестком коде в некоторых событиях формы. - person André Paul Grandsire; 10.08.2017