HWND in WPF-Applikation ermitteln
-
Hi,
ich habe folgendes recht einfaches WPF-Layout (auf das wesentliche vereinfachte Fassung):
<Window x:Class="test_csharp.MainWindow" Title="MainWindow" Height="600" Width="800"> <Grid HorizontalAlignment="Stretch" VerticalAlignment="Stretch"> ... <Frame Name="NativeArea"/> </Grid> </Window>
Eine Drittanbieter-DLL soll jetzt in die "NativeArea" zeichnen und benötigt dazu das HWND dieses Frames:
public MainWindow() { Window window = Window.GetWindow(NativeArea); var wih = new WindowInteropHelper(window); IntPtr hWnd = wih.Handle;
Das funktioniert nicht, wih.Handle ist immer 0. Ich vermute mal, das liegt daran, dass "NativeArea" kein natives Window ist, sondern irgend was "von Hand" gezeichnetes.
Meine Frage deswegen: gibt es irgend einen Elementtyp, welcher sich in ein existierendes WPF-Layout einbinden lässt und welcher trotzdem noch ein HWND hat?
Danke!
-
Du könntest ein WindowsFormsHost verwenden (und evtl. dort drin dann ein WinForms-Panel), dessen Handle du dann an die andere DLL weitergeben kannst.
Lies auch mal WPF and Win32 Interoperation.
-
OK, das funktioniert, führt mich aber zum nächsten Problem:
<Grid> <WindowsFormsHost Name="NativeAreaHost"> <wf:Panel Name="NativeArea"></wf:Panel> </WindowsFormsHost> </Grid>
Jetzt kann ich auf "NativeArea" nicht mehr zugreifen, diese ist in
Window window = Window.GetWindow(NativeArea);
nicht mehr bekannt...
-
Dein letzter Code ergibt ja auch keinen Sinn mehr.
Nimm direktNativeArea.Handle // oder NativeAreaHost.Handle
Wenn der Compiler wirklich nicht mehr den Namen erkennt, dann probiere mal
<Grid> <WindowsFormsHost x:Name="NativeAreaHost"> <wf:Panel x:Name="NativeArea"></wf:Panel> </WindowsFormsHost> </Grid>
-
Funktioniert leider nicht. Mein bisheriges
Window.GetWindow();
nimmt er nicht mehr, weil er keinen der Bezeichner kennt - auch mit dem x:Name nicht. Das Objekt NativeAreaHost.Handle ist 0 und NativeArea.Handle kennt er nicht.
-
so vll. ?
Panel panel= new Panel (); HwndSource source = (HwndSource)HwndSource.FromVisual(panel); IntPtr hWnd = source.Handle;