Frage

Wenn System.Windows.Forms.ShowDialog(IWin32Window) verwenden, soll ich in der Lage sein, in einem IWin32Window passieren repräsentiert jeden Fenstergriff und habe es mit Bezug auf das Fenster modal sein?

Im Rahmen eines Internet Explorer 7 Erweiterung versuche ich, in Bezug auf einen Internet Explorer Registerkarte ein Fenster modal zu öffnen. Es ist nicht die aktuell ausgewählten Registerkarte, aber ich kann die Hwnd des Registerkarte OK bekommen. Allerdings, wenn ich das mein Formular Showdialog passieren wird gezeigt, aber es ist nicht in Bezug auf etwas modal: Ich kann immer noch Dinge im Internet Explorer tun, auch in der Registerkarte, die angeblich sind der Eigentümer sein. Meine Form ist über den Internet Explorer-Fenster angezeigt schwimmend und es bleibt an der Spitze, so ist es nicht wie es ist einfach wie eine normale Form geöffnet, aber es ist nicht richtig modal.

Mit Spy ++ , ich kann meine Form und es ist Eigentümer Griff richtig eingestellt finden.

Bedeutet dies, dass etwas schief gegangen ist, oder ich mache etwas falsch gemacht? Wie kann ich meine Form richtig modal machen?

Zu Ihrer Information, ich bin mit dieser Wrapper-Klasse ein IWin32Window von einem hwnd (Danke 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;
}

UPDATE: Verwenden von Internet Explorer 7 & .NET 2.0

UPDATE: Spielen um einige mehr mit Spy ++ und die Griffe es macht, finde ich, dass, wenn ich einen anderen hwnd verwenden, dann kann ich mein Fenster modal auf die Registerkarte machen:

Ich war mit dem hwnd-Tab wie sie in der IWebBrowser2.HWND doc , die in Spy ++ erscheint als Klasse TabWindowClass. Es hat ein Kind der Klasse Shell DocObject View, die ein Kind von Internet_Explorer_Server hat. Wenn ich die hwnd des Internet Explorer_Server verwenden dann funktioniert es richtig, zum Beispiel, wenn ich mit der Maus auf anderen Registerkarten, klicken Sie reagiert Internet Explorer normal. Wenn ich mit der Maus auf die Registerkarte Interesse klicken, es spielt oh das Fenster d'klingen und nicht alles tun.

Ich weiß noch nicht, wie programmatisch die Internet_Explorer_Server hwnd zu bekommen, aber es sollte möglich sein.

Auch für das, was es wert ist, während mit anderen Fenstern spielen Griffe war ich in der Regel der Lage, meine Form modal zu anderen Anwendungen und Dialogen zu machen. Also ich denke, die Antwort auf meine Frage ‚viele, aber nicht alle Griffe‘ ist ... vielleicht hängt es von der Anwendung?

UPDATE: Eine andere Seite-note: Der ursprüngliche Grund, warum ich meine Form modal auf die Registerkarte anstelle des gesamten Fensters ist, dass beim Öffnen eines MessageBox von meiner Form, vorbei an der Form als Eigentümer, die MessageBox würde nicht immer offen machen wollte auf meiner Form. Wenn eine neue Registerkarte hatte Internet Explorer gerade geöffnet worden, aber nicht aktiv war, dann würde die MessageBox versteckt werden und dass Reiter zu blinken beginnen würden. da Internet Explorer mit meiner Form deaktiviert wurde jedoch geöffnet modal es zu diesen Registerkarte wechseln nicht möglich war, so Internet Explorer eingefroren werden würde. Ich dachte, dass meine Form modal auf die Registerkarte Öffnen dieses Problem lösen würde, aber ich habe eine andere Lösung gefunden ist MessageBox zu vermeiden, mit: wenn ich eine zweite Form und ShowDialog(this) von meinem ersten Formular dann das zweite Formular öffnet richtig nach vorne. So scheint es, dass Form.ShowDialog() funktioniert besser als MessageBox.Show() in einigen Fällen. Weitere Diskussionen in Probleme mit modalen Dialogen und Message .

War es hilfreich?

Lösung

Ihr Code korrekt ist. Das Problem, das Sie wahrscheinlich in obwohl ausgeführt ist, dass der IE ein Threading-Modell hat seine Registerkarten zusammen. Ich weiß nicht, die genauen Details, aber die kurze Version ist, dass jede Dose Registerkarte und wahrscheinlich als andere Registerkarten auf einem anderen Thread ausgeführt wird.

Die Modal'ness eines Dialogs ist auf den Thread, wo die spezifischen Dialog ausgeführt wird. UI auf andere Threads werden durch ein Modell-Dialog auf einem anderen Thread nicht berührt. Es ist durchaus möglich, Sie in der Lage sind Registerkarten zuzugreifen, die aus diesem Grunde auf einem anderen Thread ausgeführt werden.

Andere Tipps

Showdialog () macht zwei wichtige Dinge. Es beginnt eine Nachrichtenschleife gepumpt, so dass es modal zu dem anrufenden Code wirkt. Und es deaktiviert alle anderen Fenster in der Anwendung mit einem EnableWindow (false) API-Aufruf. Letzteres ist das, was ist in Ihrem Fall geschieht. Nicht ganz überraschend, wenn man bedenkt, dass das Fenster, das deaktiviert werden muss, ist keine WF-Fenster.

Sie müssen möglicherweise EnableWindow () selbst nennen. Achten Sie darauf, es wieder zu aktivieren, bevor der Dialog geschlossen wird oder Windows geht für eine andere App-Fenster der Jagd um den Fokus zu geben.

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

Ich habe nie versucht, diese von einer IE-Erweiterung, aber ich habe das Gefühl, dass der IE kann nicht „Respekt“ ein Win32-Stil modale Fenster die gleiche Art und Weise es ein modales Fenster von Javascript mit window.open(). angehoben hat

Haben Sie diesen Code gegen etwas anderes als IE getestet, nur um zu bestätigen es die Art und Weise funktioniert es auch für andere Anwendungen sollte?

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top