La respuesta corta es que no hay forma de hacer una ventana en el hilo B modal para una ventana en el hilo A, aunque los hilos estén en el mismo proceso. Si posee el código para ambas ventanas, puede acercarse, pero en ese caso obtendrá resultados mucho mejores para el esfuerzo al poner toda su UI en un hilo.
Si intentas sugerir al usuario que la ventana de la secuencia B es modal para la cadena A, hay muchos comportamientos sutiles de orden Z y de activación que tienes que corregir (como habrás notado) para que no sufras un extraño -Valor efecto de tipo, donde está claro para el usuario que la ventana del hilo B está tratando de ser algo que no es y, por lo tanto, parece estar roto.
Para evitar eso, me gustaría tener este enfoque:
- El usuario hace clic en "inspección de la FDA" en la ventana principal de canner.exe. canner.exe muestra un cuadro de diálogo modal que indica que está abriendo un programa externo ("Abrir configuración de botulismo ..."). Esto desactiva la ventana principal, etc. para que el usuario sepa que se está llevando a cabo una interacción modal.
- canner.exe llama al ShellExecuteEx() para iniciar botulism.exe.
- canner.exe llama a WaitForInputIdle() en el identificador devuelto por ShellExecuteEx(). WaitForInputIdle() volverá (aproximadamente, pero normalmente lo suficientemente cerca) cuando botulsim.exe esté listo para la interacción del usuario. Si botulism.exe normalmente demora cinco segundos o más para mostrar su UI, puedo usar un breve tiempo de espera con WaitforInputIdle() en un bucle y ocasionalmente procesar cualquier mensaje pendiente con PeekMessage()/ProcessMessage().
- canner.exe cambia su texto de diálogo para reflejar que está esperando que el usuario cierre botulism.exe ("Cerrar configuración de botulismo para continuar ...").
- canner.exe llama a MsgWaitForMultipleObjects() en un bucle para esperar hasta que se cierre botulsim.exe. MsgWaitForMultipleObjects() volverá cuando se señalen los identificadores pasados o cuando haya mensajes esperando en la cola del subproceso.
- Si el usuario hace clic en el cuadro de cierre en el cuadro de diálogo modal de canner.exe mientras canner.exe está esperando, canner.exe le indica al usuario que botulism.exe todavía se está ejecutando ("¿La configuración de Botulismo aún está abierta? ¿Continuar de todos modos?", Sí, lo sé "o" No, no he terminado "). Si se confirma, canner.exe cierra el cuadro de diálogo y cancela la inspección original de la FDA iniciada en el paso 1 y vuelve al ciclo de mensajes de la ventana principal.
- Cuando MsgWaitForMultipleObjects() indica que botulism.exe ha terminado, canner.exe cierra el diálogo y continúa normalmente con la inspección de la FDA inició en el paso 1.
De esta manera, si todo transcurre con normalidad y rapidez, el la interacción puede ser perfecta, pero si algo sale mal con el proceso secundario o se cambia el orden Z, etc. quedará claro por qué el proceso principal está esperando y qué debe hacer el usuario para cancelar o continuar con el proceso. tarea que comenzó.
Edición solicitada: cambio de título a "¿Cómo puedo hacer que una ventana de proceso hijo aparezca modal en mi proceso?". Su título actual no refleja la diferencia entre hacer una ventana hija modal e inyectar su ventana a otro proceso (vea SetParent()) –