Pregunta

Cuando se utiliza System.Windows.Forms.ShowDialog(IWin32Window), debería ser capaz de pasar en un IWin32Window que representa ningún identificador de ventana y tiene que ser modal con respecto a esa ventana?

Como parte de una extensión de Internet Explorer 7 Estoy tratando de abrir una ventana modal con respecto a una ficha de Internet Explorer. No es la ficha seleccionada actualmente, pero puede obtener el hwnd de la pestaña Aceptar. Sin embargo, cuando paso esto a ShowDialog se muestra mi forma, pero no es modal con respecto a cualquier cosa: todavía puedo hacer cosas en Internet Explorer, incluso en la pestaña que se supone que es el propietario. Mi forma se muestra que flota por encima de las ventanas de Internet Explorer y se mantiene en la parte superior, por lo que no es como se acaba de abrir como una forma normal, pero no es correctamente modal.

Spy ++ , puedo encontrar mi forma y es dueño del mango está configurado correctamente.

¿Quiere esto decir que algo ha ido mal, o estoy haciendo algo mal? ¿Cómo hago que mi forma modal correctamente?

Para su información, estoy usando esta clase de contenedor para crear un IWin32Window desde unos hwnd (gracias Ryan ):

/// <summary>
/// Wrapper class so that we can return an IWin32Window given a hwnd
/// </summary>
public class WindowWrapper : System.Windows.Forms.IWin32Window
{
    public WindowWrapper(IntPtr handle)
    {
        _hwnd = handle;
    }

    public IntPtr Handle
    {
        get { return _hwnd; }
    }

    private IntPtr _hwnd;
}

ACTUALIZACIÓN: Uso de Internet Explorer 7 y .NET 2.0

ACTUALIZACIÓN: Jugando un poco más con Spy ++ y las asas se expone, me parece que si uso un hwnd diferente entonces puedo hacer mi ventana modal a la pestaña:

Yo estaba usando hwnd de la pestaña como lo sugiere el IWebBrowser2.HWND doc, que a su Spy ++ aparece como TabWindowClass clase. Tiene un hijo de Shell DocObject View clase, que tiene un hijo de Internet_Explorer_Server. Si utilizo el hwnd del Internet Explorer_Server entonces funciona correctamente, por ejemplo, al hacer clic con el ratón sobre las otras fichas, Internet Explorer reacciona con normalidad. Cuando hago clic con el ratón sobre la pestaña de interés, se reproduce el sonido ventanas d'oh y no hace nada.

Yo todavía no sé cómo llegar programáticamente el hwnd Internet_Explorer_Server, pero debería ser posible.

Además, por lo que vale la pena, mientras juega con otros identificadores de ventana que estaba generalmente es capaz de hacer mi formulario modal a otras aplicaciones y cuadros de diálogo. Así que supongo que la respuesta a mi pregunta es 'muchos, pero no todos los mangos' ... posiblemente depende de la aplicación?

ACTUALIZACIÓN: Otra nota lateral: La razón original que quería hacer mi formulario modal a la pestaña en lugar de toda la ventana es que al abrir un MessageBox de mi forma, pasando la forma como propietario, el MessageBox ¿no siempre abierto en la parte superior de mi forma. Si una nueva pestaña de Internet Explorer simplemente se había abierto, pero no estaba activo, el MessageBox sería ocultado y que sería pestaña empieza a parpadear. Sin embargo, dado que Internet Explorer se ha desactivado con mi forma abierta modal que no era posible cambiar a esa pestaña, por lo que Internet Explorer se congelaría. Pensé que la apertura de mi formulario modal a la pestaña resolvería esto, pero he encontrado otra solución es evitar el uso MessageBox: si uso una segunda forma y ShowDialog(this) de mi primer formulario y luego la segunda forma se abre correctamente a la parte delantera. Así que parece que funciona mejor que Form.ShowDialog() MessageBox.Show() en algunos casos. Discusión más problemas con diálogos modales y los cuadros de mensajes .

¿Fue útil?

Solución

Su código es correcto. El problema es probable que se ejecuta en IE es que aunque tiene un modelo de subprocesos relacionados con sus pestañas. No sé los detalles exactos, pero la versión corta es que cada lata pestaña y es probable que se ejecuta en un hilo diferente al de las otras pestañas.

El Modal'ness de un cuadro de diálogo es específico para el hilo en el que el diálogo se está ejecutando. Interfaz de usuario en otros hilos no se verá afectado por un cuadro de diálogo de modelo en otro hilo. Es muy posible que son capaces de acceder a las fichas que se ejecutan en un subproceso diferente por esta razón.

Otros consejos

ShowDialog () hace dos cosas importantes. Se inicia el bombeo de un bucle de mensajes por lo que actúa de forma modal al código de llamada. Y se desactiva cualquier otra ventana de la aplicación con una EnableWindow (falso) llamada a la API. Esto último es lo que no está sucediendo en su caso. No es del todo sorprendente, teniendo en cuenta que la ventana que tiene que ser desactivado no es una ventana WF.

Es posible que tenga que llamar EnableWindow () usted mismo. Asegúrese de volver a habilitarla antes cierra el diálogo o Windows irá a la caza de la ventana de otra aplicación para dar el foco a.

Aquí hay una versión más concisa de Ryan código WindowWrapper / de Rory:

internal class WindowWrapper : IWin32Window
{
    public IntPtr Handle { get; private set; }
    public WindowWrapper(IntPtr hwnd) { Handle = hwnd; }
}

Nunca he probado esto desde una extensión IE, pero tengo el presentimiento de que IE no puede ventana modal "respeto" un estilo de Win32 la misma manera que lo hace una ventana modal levantado de Javascript usando window.open().

¿Ha probado este código en contra de algo que no sea IE, sólo para confirmar que funciona como debería para otras aplicaciones?

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top