Reputation: 4550
Windows forms had a property win1.Handle which, if I recall, returns the handle of the main window handle?
Is there an equivalent way to get the handle of a WPF Window?
I found the following code online,
IntPtr windowHandle =
new WindowInteropHelper(Application.Current.MainWindow).Handle;
But I don't think that will help me because my application has multiple windows.
Upvotes: 135
Views: 129971
Reputation: 1
Works after OnLoaded() event in my case. In the constructor it gives a zero handle.
var winHandle = new WindowInteropHelper(this).Handle;
Upvotes: 0
Reputation: 469
In my use case I needed a handle to the main window during startup, and no matter what I did I couldn't get new WindowInteropHelper(...).Handle
to return anything other than a null handle since the window hadn't been initialized yet.
You can use the EnsureHandle()
method instead, which will create the handle if it doesn't already exist, or return the current one if it does exist.
var hWnd = new WindowInteropHelper(Application.Current.MainWindow).EnsureHandle();
Once the application has started, it continues using the same handle without issue.
Upvotes: 6
Reputation: 16558
Well, instead of passing Application.Current.MainWindow
, just pass a reference to whichever window it is you want: new WindowInteropHelper(this).Handle
and so on.
Upvotes: 175
Reputation: 5813
If you want window handles for ALL of your application's Window
s for some reason, you can use the Application.Windows
property to get at all the Windows and then use WindowInteropHandler
to get at their handles as you have already demonstrated.
Upvotes: 3
Reputation: 564333
Just use your window with the WindowsInteropHelper class:
// ... Window myWindow = get your Window instance...
IntPtr windowHandle = new WindowInteropHelper(myWindow).Handle;
Right now, you're asking for the Application's main window, of which there will always be one. You can use this same technique on any Window, however, provided it is a System.Windows.Window derived Window class.
Upvotes: 52