Я точно знаю, о чем вы говорите, и проблема в том, что дизайн вашего приложения не согласуется с тем, как окна управляют фокусом. 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 сейчас пассивно-агрессивно не согласны с вами!