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 direkt

    NativeArea.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;
    

Anmelden zum Antworten