Wie kann ich ein Dialog modal wird sicherstellen, wenn sie von einem IE BHO geöffnet?

StackOverflow https://stackoverflow.com/questions/126925

  •  02-07-2019
  •  | 
  •  

Frage

Ich habe ein Browser Helper Object Internet Explorer (BHO), in C # geschrieben und in verschiedenen Orten, die ich öffnen Formen als modale Dialoge. Manchmal funktioniert dies aber in einigen Fällen ist es nicht. Der Fall, dass ich derzeit replizieren kann, wo IE Javascript läuft anderes Kind Fenster zu öffnen ... Ich denke, es ist ein bisschen verwirrt irgendwo bekommen ....

Das Problem ist, dass, wenn ich rufe:

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

wird das Formular nicht modal, also kann ich auf dem IE-Fenster klicken und es wird konzentrieren. Da IE in der Mitte ist meinen Code ausgeführt wird es nicht aktualisiert und somit den Benutzer scheint es, dass IE hängt.

Gibt es eine Möglichkeit, sicherzustellen, dass die Form als modal geöffnet wird, dh, dass es nicht möglich ist, für die Form hinter IE-Fenstern versteckt werden.

(Ich verwende IE7).

NB: Dies ist eine ähnliche Frage auf dieser Beitrag obwohl das mit Java. Ich denke, die Lösung um richtig in der IWin32Window der IE-Fenster vorbei, so suche ich in dem.

War es hilfreich?

Lösung 2

Es war nicht meine Absicht, meine eigene Frage zu beantworten, aber ...

Es scheint, dass, wenn Sie in der richtigen IWin32Window zum Showdialog () Methode übergeben es funktioniert gut. Der Trick ist, wie diese zu erhalten. Hier ist, wie ich das tat, wo ‚siteObject‘ das Objekt in die SetSite () -Methode des BHO vergangen ist:

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;
}

Dank Ryan für die WindowWrapper Klasse rel="nofollow, obwohl ich habe gehofft, es gab eine eingebaute Möglichkeit, dies zu tun?

UPDATE: das wird nicht mit geschütztem Modus auf IE8 arbeiten, da es ein HWND außerhalb, was den Zugriff auf sie sein sollte. Stattdessen werden Sie die HWND der aktuellen Registerkarte (oder eine andere Lösung?) Verwenden müssen, z.B. siehe .NET-Beispiel in diese Post für eine Art und Weise, dass zu bekommen.

Andere Tipps

Hier ist eine prägnante Version von Ryan / Rorys WindowWrapper Code:

internal class WindowWrapper : IWin32Window
{
    public IntPtr Handle { get; private set; }
    public WindowWrapper(IntPtr hwnd) { Handle = hwnd; }
}
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top