Короткий ответ: нет способа бесшовно сделать окно в потоке B модальным для окна в потоке A, даже если потоки находятся в одном и том же процессе. Если у вас есть код для обоих окон, вы можете приблизиться, но в этом случае вы добьетесь гораздо лучших результатов, поместив весь свой пользовательский интерфейс в один поток.
Если вы попытаетесь предложить пользователю, что окно потока B является модальным для потока A, существует множество тонких Z-порядков и способов активации, которые вы должны исправить (как вы заметили), чтобы не пострадать своего рода эффект долины, когда пользователю ясно, что окно потока B пытается быть тем, чем оно не является, и поэтому кажется сломанным.
Чтобы избежать этого, я бы выбрал такой подход:
- Пользователь нажимает на «FDA Inspection» в главном окне canner.exe. canner.exe показывает модальное диалоговое окно, указывающее, что он открывает внешнюю программу («Открытие настроек ботулизма ...»). Это отключает главное окно и т. Д., Чтобы пользователь знал, что происходит модальное взаимодействие.
- canner.exe вызывает ShellExecuteEx () для запуска botulism.exe.
- canner.exe вызывает WaitForInputIdle () для дескриптора, возвращенного из ShellExecuteEx (). WaitForInputIdle () вернется (приблизительно, но обычно достаточно близко), когда botulsim.exe будет готов к взаимодействию с пользователем. Если botulism.exe обычно показывает пять или более секунд для отображения своего пользовательского интерфейса, я могу использовать короткий цикл с WaitforInputIdle () в цикле и иногда обрабатывать все ожидающие сообщения с помощью PeekMessage () / ProcessMessage ().
- canner.exe изменяет текст своего диалогового окна, чтобы отразить, что он ожидает, когда пользователь закроет botulism.exe («Закрыть настройки ботулизма, чтобы продолжить ...»).
- canner.exe вызывает MsgWaitForMultipleObjects () в цикле, чтобы дождаться закрытия botulsim.exe. MsgWaitForMultipleObjects () будет возвращаться, когда переданы переданные дескрипторы или когда в очереди потока ожидают сообщения.
- Если пользователь нажимает кнопку закрытия в модальном диалоговом окне canner.exe во время ожидания canner.exe, canner.exe запрашивает пользователя о том, что botulism.exe все еще работает («Настройки ботулизма все еще открыты, продолжить в любом случае?», « Да, я знаю "или" Нет, я еще не закончил "). В случае подтверждения canner.exe закрывает диалоговое окно и отменяет первоначальную проверку FDA, начатую на шаге 1, и возвращает к циклу сообщений основного окна.
- Когда MsgWaitForMultipleObjects () указывает, что botulism.exe завершен, canner.exe закрывает диалоговое окно и обычно продолжает проверку FDA, начатую на шаге 1.
Таким образом, если все идет нормально и быстро, взаимодействие вполне может быть беспроблемным, но если что-то пойдет не так с дочерним процессом или изменится Z-порядок и т. Д., Будет понятно, почему родительский процесс ожидает и что пользователь должен сделать, чтобы отменить или продолжить задачу, которую он начал.