visual vez una tener secundaria puede primaria otro mdiparent mdichildren interfaz formularios formulario ejemplos ejemplo dentro como abrir c# winforms modal-dialog

vez - showdialog c# ejemplo



C#Winforms: mĂșltiples ventanas de nivel superior y ShowDialog() (4)

Tengo una aplicación Winforms que usa mostrar múltiples ventanas de nivel superior:

Form1 form1 = new Form1(); form1.Show(); Form2 form2 = new Form2(); form2.Show(); Application.Run();

Dentro de uno de los controladores de eventos en Form1, me gustaría poder mostrar un diálogo modal:

Dialog dialog = new Dialog(); dialog.ShowDialog(form1);

sin suspender la otra ventana de nivel superior.

es posible?


Si necesita un método alternativo para ejecutar varios subprocesos de UI, puede manejar el mensaje WM_ENABLE y usar el método EnableWindow para evitar que el Formulario se deshabilite.


Una vez que muestre un diálogo modal, hará que todas las demás ventanas en el mismo subproceso STA no se puedan utilizar. La razón detrás de esto es que el diálogo modal comenzará a interceptar todos los mensajes para ese hilo en particular. Las otras ventanas de nivel superior no podrán responder hasta que se cierre el cuadro de diálogo modal.


Hay una solución simple que parece funcionar correctamente. Simplemente puede verificar si estamos siendo deshabilitados y volver a habilitar si es necesario.

[DllImport("user32.dll")] private static extern void EnableWindow(IntPtr handle, bool enable); protected override void WndProc(ref System.Windows.Forms.Message msg) { if (msg.Msg == 0x000a /* WM_ENABLE */ && msg.WParam == IntPtr.Zero) { EnableWindow(this.Handle, true); return; } base.WndProc(ref msg); }


Tendría que ejecutar cada ventana de nivel superior en su propio hilo STA para lograr eso, creo.