Utilizando SetParent para robar la ventana principal de otro proceso pero manteniendo separados los bucles de mensajes

Fondo: mi compañero de trabajo y yo mantenemos una aplicación heredada de un millón de líneas que heredamos. Su interfaz está escrita en VB6, y como estamos dedicando casi todos nuestros recursos a convertirlo a C #, estamos buscando soluciones rápidas y sucias para nuestro problema específico.

La aplicación se comporta de forma plugin-ish. Hay hasta 20 controles ActiveX separados que se pueden cargar a la vez en un diseño de estilo de cuadrícula. El problema es que los controles ActiveX realizan todo su procesamiento en su propio subproceso de interfaz de usuario, y como muchos bloquean la espera en el acceso a la red, la interfaz de usuario se vuelve muy espesa. Cuando nuestra aplicación de alojamiento C # carga estos controles, deja de responder debido a cuántos controles están masticando los recursos de la interfaz de usuario sin hacer nada. Para colmo, los controles son frágiles y se estrellarán ante la menor provocación. Cuando están alojados en la aplicación principal de C #, se crea una inestabilidad grave.

Lo mejor que mi compañero de trabajo y yo hemos ideado hasta ahora es comenzar un proceso por control ActiveX. Este proceso, que llamamos proxy, es otra aplicación de winforms. Utiliza canalizaciones con nombre para comunicarse con el proceso de alojamiento. El proceso de alojamiento crea una ventana, carga un control ActiveX de nuestra elección (a través de algunas reflexiones y magia AxHost), y le dice al proceso principal cuál es su identificador de ventana a través de la tubería con nombre. El proceso principal utiliza una combinación de SetParent y SetWindowPos para mover la aplicación proxy a sí misma para emular un complemento. Las actualizaciones de tamaño se envían a través de la tubería con nombre.

Esto funciona lo suficientemente bien hasta que la aplicación ActiveX realiza algún tipo de proceso largo y hacemos clic en la ventana principal mientras está funcionando. Por un tiempo, la ventana principal responde, pero eventualmente deja de responder cuando la ventana secundaria espera su subproceso de interfaz de usuario. ¿Cómo podemos mantener las ventanas secundarias en su propio hilo completo mientras obtenemos los beneficios de SetParent?

(¡avíseme si algo no está claro!)

Respuestas a la pregunta(1)

Su respuesta a la pregunta