Frage

Ich habe versucht zu verstehen Process.MainWindowHandle.

Laut MSDN;„Das Hauptfenster ist das Fenster, das beim Starten des Prozesses erstellt wird.Nach der Initialisierung können andere Fenster geöffnet werden, einschließlich der Modal- und TopLevel-Fenster Das erste mit dem Prozess verknüpfte Fenster bleibt das Hauptfenster." (Betonung hinzugefügt)

Aber beim Debuggen bemerkte ich, dass MainWindowHandle seinen Wert zu ändern schien ...was ich nicht erwartet hatte, insbesondere nachdem ich die obige Dokumentation gelesen hatte.

Um das Verhalten zu bestätigen, habe ich eine eigenständige WinForms-App mit einem Timer erstellt, um alle 100 ms das MainWindowHandle des Prozesses „DEVENV“ (Visual Studio) zu überprüfen.

Hier ist der interessante Teil dieser Test-App ...

    IntPtr oldHWnd = IntPtr.Zero;

    void GetMainwindowHandle()
    {
        Process[] processes = Process.GetProcessesByName("DEVENV");

        if (processes.Length!=1)
            return;

        IntPtr newHWnd = processes[0].MainWindowHandle;

        if (newHWnd != oldHWnd)
        {
            oldHWnd = newHWnd;
            textBox1.AppendText(processes[0].MainWindowHandle.ToString("X")+"\r\n");
        }

    }

    private void timer1Tick(object sender, EventArgs e)
    {
        GetMainwindowHandle();
    }

Sie können sehen, wie sich der Wert von MainWindowHandle ändert, wenn Sie beispielsweise auf ein Dropdown-Menü in VS klicken.

MainWindowHandleMystery

Vielleicht habe ich die Dokumentation falsch verstanden.

Kann jemand Licht ins Dunkel bringen?

War es hilfreich?

Lösung

@edg,

Ich vermute, es ist ein Fehler in MSDN.Sie können in Relfector deutlich sehen, dass die Überprüfung des „Hauptfensters“ in .NET wie folgt aussieht:

private bool IsMainWindow(IntPtr handle)
{
    return (!(NativeMethods.GetWindow(new HandleRef(this, handle), 4) != IntPtr.Zero)  
             && NativeMethods.IsWindowVisible(new HandleRef(this, handle)));
}

Wenn .NET-Code Fenster auflistet, ist es ziemlich offensichtlich, dass das erste sichtbare Fenster (d. h.Fenster der obersten Ebene) wird diesen Kriterien entsprechen.

Andere Tipps

Tatsächlich ist Process.MainWindowHandle ein Handle des obersten Fensters, es ist nicht wirklich das „Hauptfenster-Handle“.

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