Delphi fsStayOnTop Странность

Вот сделка. Основная форма установлена ​​на fsNormal, Эта основная форма развернута на весь экран с плавающей панелью инструментов. Панель инструментов - обычная форма со стилем, установленным на fsStayOnTop,

В большинстве случаев это работает как ожидалось. Отображается основная форма, и панель инструментов плавает поверх нее.

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

  1. Когда alt-tabbing от приложения Delphi, плавающий верх fsStayOnTop форма остается поверх других приложений. Так что, если я перейду на Firefox, то плавающее меню останется поверх Firefox.

  2. При альт-табинге из другого приложения в приложение Delphi плавающее меню не отображается (так как оно находится за fsNormal MainForm).

Это известная ошибка или есть какие-то взломы, чтобы заставить ее работать? Это также, по-видимому, происходит чаще всего, когда запущено несколько копий приложения (они не взаимодействуют между собой и должны запускаться в собственной "песочнице" Windows).

Как будто Delphi запутывается, какое окно должно быть сверху, и меняет их местами или изменяет плавающую форму на режим "оставайся наверху".

Или я неправильно понял fsStayOnTop? Я предполагаю, установив стиль формы fsStayOnTop позволяет ему оставаться поверх всех других форм в текущем приложении, а не всех окон других запущенных приложений.

3 ответа

Я не знаю ошибки в этой области.

Позвольте мне сначала объяснить, как этот процесс работает:

Delphi впервые использует fsStayOnTop стиль при создании окна, которое содержит форму, вызывая функцию win32 SetWindowPos с HWND_TOPMOST параметр.

См. http://msdn.microsoft.com/en-us/library/ms633545(VS.85).aspx для подробного объяснения SetWindowPos,

Каждый раз, когда приложение деактивировано или свернуто, Delphi перечисляет все самые верхние формы для нормализации форм (нормализация - это термин, который используется в vcl для обозначения того, что самые верхние окна превращаются в не самые верхние), и он хранит внутренний список всех окна, которые были самыми высокими в тот момент.

Каждый раз, когда приложение активируется или восстанавливается, Delphi использует информацию, хранящуюся в списке самых верхних окон, для восстановления всех самых верхних форм (используя setWindowPos с HWND_TOPMOST параметр)

Поэтому мне кажется, что проблема заключается в том, как Delphi хранит информацию при перечислении окон, когда приложение свернуто.

Я бы взломал функцию минимизации или деактивации и проверил бы список самых верхних окон (он включен Application.FTopMostList) правильно перечислены.

Немного больше информации и возможное решение.

Установите плавающую форму на fsnormal.

Когда происходит событие mainform.activate, вызывается плавающая форма. Bringtofront.

Но я также использую stayontop для всех других диалогов приложения. Когда запущено несколько копий приложения, в диалоговых окнах отображается та же проблема (т. Е. Если в app1 открыто диалоговое окно и он находится на вкладке alt-tabable, диалоговое окно может остаться поверх всех других программ).

У меня была похожая проблема, и эта ссылка мне очень помогла: Delphi: Balloon Form с fsStayOnTop не работает в Win7

Когда я вызываю функцию Application.NormalizeTopMosts(), самые верхние формы ведут себя так, как я ожидаю.

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