Bueno o malo – SetParent () win32 API entre diferentes procesos

La función SetParent toma un elemento secundario y un controlador de ventana principal nuevo. Esto también parece funcionar cuando la ventana secundaria está en un proceso de Windows diferente.

He visto una publicación que afirma que esto no es oficialmente compatible, pero los documentos actuales ya no lo mencionan. ¿Es esto un defecto en los documentos actuales, o cambió este comportamiento?

 HWND WINAPI SetParent( __in HWND hWndChild, __in_opt HWND hWndNewParent ); 

Puede tener una relación padre-hijo con las ventanas en diferentes procesos. Es complicado hacer que funcione en todos los casos. Puede que tenga que depurar varios síntomas extraños.

Normalmente, las ventanas en procesos separados obtendrían sus mensajes de colas de entrada separadas usando bombas de mensajes separadas. Cuando utiliza SendMessage en una ventana en otro proceso, en realidad se publica en la cola de la otra ventana, se procesa allí y la devolución se calcula de forma efectiva al proceso original. Entonces, si uno de los procesos deja de manejar los mensajes, también puede bloquear efectivamente el otro. (Eso es cierto incluso dentro de un proceso cuando las ventanas se crean en diferentes subprocesos y las colas de subprocesos no se han adjuntado).

Pero cuando configura la relación padre / hijo entre ventanas en diferentes subprocesos, Windows asocia esas colas de entrada, forzando el procesamiento del mensaje para que sea sincrónico. Ya no estás en el caso normal, pero te enfrentas a los mismos tipos de problemas: un locking en el procesamiento de una ventana bloquea efectivamente el otro proceso.

Tenga cuidado con los mensajes que pasan punteros en los params. Los punteros no serán válidos en el proceso de recepción. (Hay un par de excepciones, como WM_COPYDATA , que recrea los datos en el proceso de recepción para usted. Pero incluso aquellos tienen limitaciones).

Tienes que tener especial cuidado cuando las ventanas están siendo destruidas. Si es posible, desconecte la relación padre-hijo antes de destruir cualquiera de las ventanas. Si no es posible, entonces probablemente sea mejor destruir manualmente la ventana secundaria antes de que se destruya el padre. Normalmente, la destrucción de un padre hará que los niños se destruyan automáticamente, pero es fácil quedar bloqueado cuando el niño está en otro proceso (o un hilo no conectado).

En las versiones más nuevas de Windows (Vista +), también puede golpear algunas aceleraciones de velocidad de seguridad si los procesos se ejecutan en diferentes niveles de integridad.

Gracias a IInspectable que señaló un error en mi respuesta anterior.