10 Stimmen

Unerwartetes Verhalten von Process.MainWindowHandle

Ich habe versucht zu verstehen Process.MainWindowHandle.

Laut MSDN; "Das Hauptfenster ist das Fenster, das erstellt wird, wenn der Prozess gestartet wird. Nach der Initialisierung können andere Fenster geöffnet werden, einschließlich der Modal- und Top-Level-Windows, aber das erste Fenster, das mit dem Prozess verbunden ist, bleibt das Hauptfenster." (Hervorhebung hinzugefügt)

Aber während des Debuggens fiel mir auf, dass sich der MainWindowHandle-Wert zu ändern schien... was ich nicht erwartet hatte, insbesondere nach Konsultation der oben genannten Dokumentation.

Zur Bestätigung des Verhaltens habe ich eine eigenständige WinForms-App mit einem Timer erstellt, um alle 100 ms das MainWindowHandle des "DEVENV" (Visual Studio) Prozesses 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();
    }

Man kann den Wert von MainWindowHandle ändern sehen, wenn man (zum Beispiel) in VS auf ein Dropdown-Menü klickt.

MainWindowHandleMystery

Vielleicht habe ich die Dokumentation falsch verstanden.

Kann mir jemand Licht ins Dunkel bringen?

0 Stimmen

Ich habe wegen dieses Fehlers 10 Stunden verloren. Danke MS!

11voto

aku Punkte 118808

@edg,

Ich denke, es handelt sich um einen Fehler in MSDN. Sie können deutlich in Relfector sehen, dass die "Hauptfenster"-Überprüfung in .NET so aussieht:

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

Wenn der .NET-Code Fenster auflistet, ist es ziemlich offensichtlich, dass das erste sichtbare Fenster (d.h. das oberste Fenster) diese Kriterien erfüllen wird.

5voto

aku Punkte 118808

Eigentlich ist Process.MainWindowHandle ein Handle des obersten Fensters, es ist nicht wirklich das "Hauptfensterhandle"

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X