Delphi - как узнать, какой модальный диалог находится в фокусе, и вывести его на передний план?

У меня есть приложение Delphi 2006, которое может открывать модальное диалоговое окно в ответ на состояние ошибки. Кажется, что он входит в состояние, когда один из этих модальных диалогов открыт, расположен перед основной формой, но ни одна из форм не отвечает на сообщения. Нажатие на любой из них дает «бонк». Приложение работает нормально, пользовательский интерфейс обновляет основную форму, но вы ничего не можете сделать. Я предполагаю, что под основной формой, скорее всего, есть еще один модальный диалог. Является ли это одним из моих или один из Windows, я понятия не имею.

Прочее:

  • приложение нормально реагирует на сочетания клавиш. Один из этих ярлыков изящно закрывает приложение, и это сработало. С тех пор я не смог воспроизвести ситуацию.
  • у приложения есть значок в трее. Это отвечает на щелчок правой кнопкой мыши.Если я сверну приложение отсюда, основная форма свернется и оставит модальное диалоговое окно открытым, все еще без фокуса. Если я восстановлю основную форму, все будет так, как было, ни одно окно не будет иметь фокуса. Alt-tab имеет аналогичные результаты.
  • платформа — Windows 7
  • Я вызываю DisableProcessWindowsGhosting перед созданием любых форм
  • Я открываю модальные диалоги с помощью

    ModalDialog.PopupParent := MainForm ;
    ModalDialog.ShowModal ;
    
  • Я откладываю эти диалоги ошибок, если открыты другие модальные диалоги:

    если (Application.ModalLevel = 0), то
     {открыть модальное диалоговое окно}
    

Мой вопрос состоит из двух частей:

Есть ли способ программно определить, какое окно имеет фокус? Затем я мог бы предпринять какое-то действие для этого сценария или, в крайнем случае, я мог бы предоставить им горячую клавишу, чтобы вывести его на передний план, или предпринять какое-то уклончивое действие (в зависимости от диалога), например, установить для ModalResult значение mrCancel.

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

**ОБНОВЛЕНИЕ* *

Исправление Миши работало, кроме диалогов, не относящихся к Delphi, таких как TSaveDialog. Я также смог заставить их работать, добавив Application.ModalPopupMode := pmAuto ;непосредственно перед вызовом Execute.

Под «заработало» я имею в виду, что диалоговое окно сохранения было впереди после следующей последовательности:

  • открыть диалоговое окно сохранения
  • свернуть приложение из значка в трее
  • восстановить приложение из значка в трее

тогда как он находился за основной формой без ModalPopupMode := pmAuto.

Так что я надеюсь, что эти изменения помогут решить (пока еще не воспроизведенную) проблему.

7
задан rossmcm 22 March 2012 в 13:13
поделиться