Pregunta

Tengo un objeto auxiliar del navegador Internet Explorer (BHO), escrito en C#, y en varios lugares abro formularios como cuadros de diálogo modales.A veces esto funciona pero en otros casos no.El caso que puedo replicar en este momento es cuando IE ejecuta javascript para abrir otras ventanas secundarias...Supongo que en alguna parte se está confundiendo un poco...

El problema es que cuando llamo:

(new MyForm(someParam)).ShowDialog();

el formulario no es modal, por lo que puedo hacer clic en la ventana de IE y se enfoca.Dado que IE está ejecutando mi código, no se actualiza y, por lo tanto, al usuario le parece que IE se está bloqueando.

¿Hay alguna forma de garantizar que el formulario se abra como modal, es decir, que no sea posible ocultar el formulario detrás de las ventanas de IE?

(Estoy usando IE7.)

NÓTESE BIEN:esta es una pregunta similar a esta publicación aunque eso es usar java.Supongo que la solución consiste en pasar correctamente la ventana IWin32Window de la ventana de IE, así que estoy investigando eso.

¿Fue útil?

Solución 2

No era mi intención responder mi propia pregunta, pero...

Parece que si pasa el IWin32Window correcto al método ShowDialog(), funciona bien.El truco es cómo conseguirlo.Así es como lo hice, donde 'siteObject' es el objeto pasado al método SetSite() del BHO:

IWebBrowser2 browser = siteObject as IWebBrowser2;
if (browser != null) hwnd = new IntPtr(browser.HWND);
(new MyForm(someParam)).ShowDialog(new WindowWrapper(hwnd));

...

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

    public IntPtr Handle
    {
        get { return _hwnd; }
    }

    private IntPtr _hwnd;
}

Gracias a ryan para la clase WindowWrapper, aunque esperaba que hubiera una forma integrada de hacer esto.

ACTUALIZAR:esto no funcionará en IE8 con Modo Protegido, ya que accede a un HWND fuera de lo que debería ser.En su lugar, tendrá que usar el HWND de la pestaña actual (¿o alguna otra solución?), p.e.ver ejemplo de .net en esta publicación para encontrar una forma de conseguirlo.

Otros consejos

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

internal class WindowWrapper : IWin32Window
{
    public IntPtr Handle { get; private set; }
    public WindowWrapper(IntPtr hwnd) { Handle = hwnd; }
}
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top