2008-09-25 30 views
8

Quiero hacer un formulario .NET como el formulario de mayor valor para otra aplicación externa (no relacionada con .NET, Win32 puro) por lo que se mantiene por encima de ese Win32App, pero no el resto del aplicaciones en ejecución.Cómo cambiar el propietario de una ventana usando su identificador

tengo el mango de la win32app (proporcionado por el propio win32app), y he tratado Win32 SetParent() function, a través de P/Invoke in C#, pero entonces mi Formulario .NET consigue confinados en el win32app y eso no es lo que quiero.

Respuesta

12

Creo que estás buscando es P/Invoke SetWindowLongPtr(win32window, GWLP_HWNDPARENT, formhandle)

Google Search

+1

El problema es que busqué en Google con la palabra "cambiar el propietario de la ventana" en lugar de buscar "cambiar el padre de Windows". :) –

+11

Pasé por esta respuesta varias veces pensando que estaba respondiendo la pregunta incorrecta, hasta que leí lo siguiente en los documentos msdn: "" No debe llamar a SetWindowLong con el índice GWL_HWNDPARENT para cambiar el elemento primario de una ventana secundaria. En cambio, use la función SetParent. "Esta declaración es engañosa. GWL_HWNDPARENT cambia el PROPIETARIO, no el padre, de una ventana. Es seguro usarlo para ese propósito". – bj0

2

Sí! Ya tengo una importación de P/Invoke de SetWindowLongPtr (que es x64 segura). Y el uso del reflector He buscado en la propiedad Form.Owner (es decir, el método get_Owner (valor Formulario)) y logró cambiar el propietario con

SetWindowLongPtr(childHdl, -8, OwnerHdl) 

que estaba buscando lo que el -8 (0xFFFFFFFFFFFFFFF8) significaba antes de que pudiera publica la solución aquí, pero Joel ya lo ha señalado.

Gracias!

Cuestiones relacionadas