Приложение Winforms без основной формы - диалоговое окно не отображается сверху - PullRequest
2 голосов
/ 22 июня 2010

У меня есть приложение winforms, которое на самом деле не имеет основной формы - это просто простой инструмент для обработки файлов, поэтому он действительно не нужен.

Когда приложение запускается, сначала OpenFileDialog используется для выбора файла. Затем отображается диалоговое окно с использованием Showdialog () с некоторыми параметрами того, как должен обрабатываться выбранный файл. Наконец, во время работы с файлом отображается форма индикатора выполнения, и приложение закрывается.

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

Обычно, когда ShowDialog приводит к появлению диалогового окна, которое возникает после, решение состоит в том, чтобы использовать вызов Showdialog (владельца), за исключением того, что у меня нет основной формы, чтобы говорить о том, что у меня нет владельца, чтобы установить .

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

1 Ответ

3 голосов
/ 22 июня 2010

Я точно знаю, о чем вы говорите, и проблема в том, что дизайн вашего приложения не согласуется с тем, как окна управляют фокусом. Windows делал подобные вещи с win31. Это как захват земли; если вы показываете окно из своего приложения, а затем скрываете / отключаете его, Вы откладываете, вы теряете согласно Биллу. Исправление: вам нужно главное окно! Или смени ОС. Тот факт, что он работает из EXE-файла, не означает, что он будет работать, когда один из ваших пользователей запустит его из пакетного файла или другого файла, кроме проводника.

Вы МОЖЕТЕ выбраться из этого - запустите 3 отдельных файла; попробуйте запустить 3 темы Application.Run в вашем разделе Main; использовать для SetTopMost, AppActivate себя.

Или посмотрите, как заставить ваше приложение захватывать фокус ввода с помощью вызовов SDK - какие последовательные версии окон затрудняют его использование для уменьшения вредных приложений (следовательно, приложение, которое может сделать это в w98, будет мигать на панели задач оранжевый в xp) - и тогда программисты обходили это, конечно. Вы могли бы сделать это.

Но вы бы поступили неправильно. Реактор в порядке и изменен в будущих приложениях. Это не решение, которое я принял; способ работы окон основан на камне, плюс способ, которым пользователи ожидают, что он будет работать, задан миллионами мозгов, что сложнее, чем камень - плыви по течению!

Простой рефактор без реального воздействия:

  • Резервное копирование вашего проекта (или отложенная копия в TFS)
  • В вашем диалоге настроек вырежьте все свои элементы управления. Поместите в панель размером с форму с именем pnlOpts. Вставьте их обратно.
  • Сделайте эту форму вашей основной формой.
  • В форме form_shown установите pnlOpts.Visible = false или просто установите его по умолчанию таким образом (вы можете показать другую панель с именем приложения или фоновое изображение, если хотите быть немного грязным ;-)
  • Вызовите код установки, который также показывает файл dlg из этой области
  • Установите для вашего файла dlg, чтобы эта форма была родительской, а начальная позиция - центром-родителем (я имею в виду владельца, а не родителя). Не забудьте отменить это = закрыть форму настроек
  • Когда это будет сделано, покажите pnlOpts.
  • В кнопке ОК вызовите код, который выполняет индикатор выполнения. Вы можете скрыть или отключить pnlOpts здесь снова.
  • Ни в коем случае нельзя скрывать, устанавливать Visible = false или enabled = false в окне ВЕСЬ, иначе вы вызовете фокусирующий гнев окон (который является причиной вашего несчастья здесь).

Реальный ключ здесь, однострочный ответ: оставить главное окно видимым и включенным всегда, если вы хотите отключить его функциональность, просто серый или скрыть все его элементы управления. это проще всего делать с панелью. Вы можете показывать пользователю другие панели или изображения, чтобы развлекать их, если хотите (особенно если серое [.enabled = false] содержимое не имеет смысла).

Вам не понравится, как это выглядит, иначе вы бы с самого начала построили его таким образом, но миллионы строк кода Windows и миллионы мозгов пользователей Windows сейчас пассивно-агрессивно не согласны с вами!

...