Delphi fsStayOnTop Странность
Вот сделка. Основная форма установлена на fsNormal
, Эта основная форма развернута на весь экран с плавающей панелью инструментов. Панель инструментов - обычная форма со стилем, установленным на fsStayOnTop
,
В большинстве случаев это работает как ожидалось. Отображается основная форма, и панель инструментов плавает поверх нее.
Иногда (это ошибка, позволяющая найти воспроизводимый набор шагов) при добавлении alt-tab в другие приложения (или при щелчке значка приложения Delphi на панели задач) могут возникать следующие симптомы:
Когда alt-tabbing от приложения Delphi, плавающий верх
fsStayOnTop
форма остается поверх других приложений. Так что, если я перейду на Firefox, то плавающее меню останется поверх Firefox.При альт-табинге из другого приложения в приложение 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(), самые верхние формы ведут себя так, как я ожидаю.