How to get the hWnd of Window instance?

C#Wpf

C# Problem Overview


My WPF application has more than one window, I need to be able to get the hWnd of each Window instance so that I can use them in Win32 API calls.

Example of what I would like to do:

Window myCurrentWindow = Window.GetWindow(this);
IntPtr myhWnd = myCurrentWindow.hWnd; // Except this property doesn't exist.

What's the best way to do this?

C# Solutions


Solution 1 - C#

WindowInteropHelper is your friend. It has a constructor that accepts a Window parameter, and a Handle property that returns its window handle.

Window window = Window.GetWindow(this);
var wih = new WindowInteropHelper(window);
IntPtr hWnd = wih.Handle;

Solution 2 - C#

Extending on Douglas's answer, if the Window has not been shown yet, it might not have an HWND. You can force one to be created before the window is shown using EnsureHandle():

var window = Window.GetWindow(element);

IntPtr hWnd = new WindowInteropHelper(window).EnsureHandle();

Note that Window.GeWindow can return null, so you should really test that too.

Attributions

All content for this solution is sourced from the original question on Stackoverflow.

The content on this page is licensed under the Attribution-ShareAlike 4.0 International (CC BY-SA 4.0) license.

Content TypeOriginal AuthorOriginal Content on Stackoverflow
QuestionDrahcirView Question on Stackoverflow
Solution 1 - C#DouglasView Answer on Stackoverflow
Solution 2 - C#Drew NoakesView Answer on Stackoverflow