2016-07-29 3 views
0

Ich erstellte ein normales WPF-Fenster, das keine Window.Owner hat. Dieses Fenster hat ein Besitzer-Handle-Set, wenn es seine WindowInteropHelper.Owner-Eigenschaft überprüft. Ich erkannte auch, dass das eigene Fensterrechteck mit jedem neuen Fenster irgendwo auf dem Desktop kaskadiert wird (mit GetWindowRect).WPF-Fenster hat Besitzerhandle aber keinen Besitzer

Kann mir jemand sagen, was dort vor sich geht? Ist es etwas wie ein Standardverhalten in WPF, um die Startposition auf das Zentrum des Besitzers zu setzen, wenn es keinen echten Besitzer gibt?

Die Sache ist, würde Ich mag zwei Fälle unterscheiden, um die Lage sein, um das Fenster zu der Besitzer Fenstermitte zu zentrieren oder - wenn kein Besitzer gibt es - die Bildschirmmitte (!):

  • Das Fenster Besitzer ein nicht-WPF-Fenster ist (zB wenn in einem vsto Plugin verwendet)
  • in der Tat Es Fenster kein Besitzer

wenn jemand eine Idee hat, wie ich das erkennen konnte oder meine Anforderungen achive, Ich würde mich freuen :)

Mit freundlichen Grüßen Lumo

Antwort

0

Die Window.Owner Eigenschaft nur im Fall funktioniert das übergeordnete Fenster ist ein WPF-Fenster. Da die gesamte Eltern-Kind-Struktur von Fenstern vom Betriebssystem gehandhabt wird, ist es sehr gut möglich, eine solche Beziehung zwischen Fenstern verschiedener Frameworks herzustellen.

Wenn Sie also ein Fensterhandle mit der WindowInteropHelper abrufen können, wissen Sie, dass es ein Besitzerfenster gibt. Aber es könnte ein natives Fenster oder ein Windows-Formularfenster sein.

Da alles, was Sie wollen, ist die Bounding Box des Eigentümers Fenster, können Sie einfach die Windows-API, um die Bounding-Box zu holen. Die Funktion, die Sie für das verwenden möchten ist: GetWindowRect

Ich nehme an, Sie sind eine verwaltete Sprache wie C# oder VB.net so gibt das Beispiel, wie die Funktion mit C# zuzugreifen:

[DllImport("user32.dll", SetLastError = true)] 
static extern bool GetWindowRect(IntPtr hWnd, out RECT lpRect); 

[StructLayout(LayoutKind.Sequential)] 
public struct RECT { 
    public int Left; 
    public int Top; 
    public int Right; 
    public int Bottom; 
} 

Die Handle Sie brauchen für die Funktion ist der Fenstergriff, den Sie mit der WindowInteropHelper holen. Wenn Ihr Handle nicht auf ein Fenster zeigt, gibt die Funktion false zurück. In diesem Fall ist Ihr Handle entweder ungültig oder null. In solchen Fällen müssen Sie auf die Bildschirmgröße zurückgreifen, um Ihr Fenster zu zentrieren.

EDIT 1: Da ich das eigentliche Problem total missverstanden habe, hier ist eine andere Idee. Es gibt einen Helfer "Fenster" Griff, der immer den gesamten Bildschirm abdeckt. Wenn ich dieses Konzept richtig verstehe, wird immer ein Fenster auf dem Desktop angezeigt, das auf dem Desktop angezeigt wird. Sie können das Handle mit der Funktion GetDesktopWindow abrufen.

[DllImport("user32.dll", SetLastError = true)] 
static extern IntPtr GetDesktopWindow(); 
+0

Ich denke, Sie haben den Punkt nicht verstanden. Ich habe bereits GetWindowRect verwendet und es gibt true zurück, obwohl ich kein Elternteil auf das Fenster gesetzt habe. Das Rect ist kaskadiert, wie ich in meiner Frage geschrieben habe. Danke trotzdem für deine Antwort! – Lumo

+0

Ah, jetzt verstehe ich es. Ist es möglich, dass Sie das Handle des "DesktopWindow" bekommen?Es gibt einen Hilfsfenstergriff, der immer den gesamten Bildschirm abdeckt. Sie können den Handle dazu mit der Funktion 'GetDesktopWindow' holen. Vielleicht hilft das, herauszufinden, was das wahre Elternteil des Fensters ist? – Nitram

+0

Ich habe den DesktopWindow Pointer überprüft, es ist ein anderer. Mit jedem neuen Fenster gibt es ein anderes Besitzerhandle und dieses neue Besitzerfenster ist kaskadiert. Ist dies nicht das Standardverhalten eines Fensters in WPF? – Lumo