Mi aplicación es un ejecutable vb6, pero algunas formas más nuevas en el sistema están escritas en C#. Me gustaría poder establecer la propiedad Propietario del formulario C# utilizando un identificador en la ventana principal de la aplicación, para que los cuadros de diálogo permanezcan en la parte superior cuando se avanza y retrocede entre mi aplicación y otras aplicaciones.¿Puedo obtener el comportamiento de establecer el propietario de mi formulario WinForms usando un hwnd/NativeWindow?
Puedo obtener el hwnd de la ventana principal de la aplicación. No estoy seguro de lo que puedo hacer desde allí?
Actualización 20 de Oct '08 a las 17:06:
Scott,
Gracias por la respuesta. Había pasado por alto que el parámetro del método Show/ShowDialog no era de tipo Formulario; solo buscaba en la propiedad Owner.
Modifiqué ligeramente el código que estoy usando de los anteriores - tenemos un componente que carga nuestros Formularios y llama a ShowDialog. Mi código es el siguiente:
Form launchTarget = FormFactory.GetForm(xxx); // psuedo-code for generic form loader
launchTarget.StartPosition = FormStartPosition.CenterParent;
IWin32Window parentWindow = GetWindowFromHwnd(hwnd);
launchTarget.ShowDialog(parentWindow);
GetWindowFromHwnd
es una versión método envueltas de su código:
private IWin32Window GetWindowFromHost(int hwnd)
{
IWin32Window window = null;
IntPtr handle = new IntPtr(hwnd);
try
{
NativeWindow nativeWindow = new NativeWindow();
nativeWindow.AssignHandle(handle);
window = nativeWindow;
}
finally
{
handle = IntPtr.Zero;
}
return window;
}
Desafortunadamente esto no es hacer lo que yo esperaba. El formulario se muestra modalmente, pero no se muestra en la posición correcta ni está aún en la parte superior cuando elimino la pestaña y regreso a la ventana principal. Nuestros modales no muestran una tarea en la barra de tareas, por lo que la ventana aparentemente "desaparece" (aunque todavía está presente en la lista de ventanas de alt-tab). Eso para mí indica que podría no tener el derecho de hwnd. Si tiene alguna otra sugerencia, responda. Gracias de nuevo.
Actualización 10 de Nov '08 a las 16:25
Una observación de seguimiento - Si se toma hacia fuera en una llamada a un método en un try/finally, como en el segundo puesto de Scott, la llamada en el bloque finally debe ser:
parentWindow.ReleaseHandle();
Scott - disculpa por la larga demora, se tiró en otras cosas. Su respuesta original enviada funciona muy bien. Solo necesitaba pasar NativeWindow a través de ShowDialog en lugar de configurar Form.Owner. Mi otro problema fue que el código de llamada no estaba pasando el hWnd correcto en primer lugar. Gracias – mcw0933
FYI, ambos problemas anteriores son solucionables - para el centrado, asegúrese de establecer: "form.StartPosition = FormStartPosition.CenterParent" - para el toppyness asegúrese de establecer: form.TopMost = true; - Por cierto, gracias por la información en ReleaseHandle()! :-) – BrainSlugs83