Erzwingt die Erstellung eines nativen Win32-Handles des WPF-Fensters

7

Ich muss auf die Win32-Fensterhandles einiger meiner WPF-Fenster zugreifen, damit ich Win32-Aktivierungsnachrichten verarbeiten kann. Ich weiß, dass ich PresentationSource.FromVisual oder WindowInteropHelper verwenden kann, um das Win32-Fenster-Handle zu erhalten, aber ich habe Probleme, wenn das WPF-Fenster noch nicht erstellt wurde.

Wenn ich PresentationSource.FromVisual verwende und das Fenster nicht erstellt wurde, ist das zurückgegebene PresentationSource null. Wenn ich WindowInteropHelper verwende und das Fenster nicht erstellt wurde, ist die Eigenschaft Handle IntPtr.Zero (null).

Ich habe versucht, this.Show() und this.Hide() im Fenster aufzurufen, bevor ich auf das Handle zugreifen wollte. Ich kann dann den Griff bekommen, aber das Fenster blinkt kurzzeitig auf dem Bildschirm (hässlich!).

Kennt jemand eine Möglichkeit, ein WPF-Fenster zu erzwingen? In Windows Forms war dies so einfach wie der Zugriff auf die Eigenschaft Form.Handle .

Bearbeiten: Am Ende ging ich mit einer Variante von Chris Taylors Antwort. Hier ist es, falls es jemand anderem hilft:

%Vor%     
Zach Johnson 10.07.2010, 19:11
quelle

4 Antworten

3

Eine Option besteht darin, den Fensterstatus auf "minimiert" zu setzen und ihn nicht in der Taskleiste anzuzeigen, bevor das Fenster angezeigt wird. Probieren Sie so etwas aus.

%Vor%     
Chris Taylor 10.07.2010, 19:49
quelle
18

Verwenden Sie WindowInteropHelper.EnsureHandle , es tut genau das, was Sie brauchen.

    
Daniel Albuschat 28.01.2011 09:42
quelle
2

Ich habe nach einer Lösung gesucht, wenn das Handle von WindowInteropHelper NULL ist. Hoffentlich gibt dieser Post einige zusätzliche Informationen, wie man es löst.

Eine Lösung ist zu verwenden:

%Vor%

Dies funktioniert nur mit .NET Framework 4.

Im Moment verwende ich .NET Framework 3.5, also brauchte ich eine andere Lösung. Dann habe ich einen Forum-Thread mit einer WindowInteropHelper-Erweiterungsmethode gefunden:

%Vor%

Das WindowInteropHelper.EnsureHandle () erwartet nicht, dass ein Fenster bereits erstellt wird.

  

Referenz: Alexander Yudakov - Ссылка

    
J Pollack 12.08.2011 07:31
quelle
0

Ich steckte in demselben Problem und ging mit J Pollacks Antwort (weil es mir sauberer scheint), aber benötigt etwas, das sowohl auf der .NET-Laufzeitumgebung 2.0 als auch 4.0 ausgeführt werden würde.

Aber als ich das gemacht habe, endete ich mit einer hässlichen MissingMethodException , weil SafeCreateWindow in der .NET-Laufzeitumgebung 4.0 nicht mehr existiert. Um den Code für beide Laufzeiten funktionsfähig zu machen, entschied ich mich, die MissingMethodException abzufangen und das Äquivalent in der .NET 4.0-Laufzeit stattdessen wie folgt aufzurufen:

%Vor%

Dadurch konnte ich den Code mit .NET 3.5 kompilieren, aber auf .NET Runtime 4.0 auf Systemen, auf denen nur die höhere Laufzeitversion installiert ist (nämlich Windows 8 und höher).

    
Sascha 23.10.2014 20:33
quelle

Tags und Links