2012-05-20 3 views
42

В моем приложении WPF есть несколько окон, мне нужно получить hWnd каждого экземпляра окна, чтобы я мог использовать их в вызовах API Win32.Как получить экземпляр hWnd экземпляра Window?

пример того, что я хотел бы сделать:

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

Какой самый лучший способ сделать это?

+2

Возможный дубликат [Можно ли получить Hwnd элемента управления всплывающим окном WPF?] (Http://stackoverflow.com/questions/7815121/is-it-possible-to-get-the-hwnd-of- a-wpf-popup-control) –

+2

@HansPassant: Другой вопрос касался всплывающих элементов управления, а не фактических окон. (Да, этот вопрос также косвенно ответил в нем, но это не дубликат.) – Douglas

ответ

58

WindowInteropHelper - твой друг. Он имеет конструктор, который принимает параметр Window и свойство Handle, которое возвращает свой дескриптор окна.

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

Расширение на ответ Дугласа, если Window не было показано ранее, это может не иметь HWND. Вы можете заставить один должен быть создан до того, как окно показано с помощью EnsureHandle():

var window = Window.GetWindow(element); 

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

Обратите внимание, что Window.GeWindow может вернуться null, так что вы действительно должны проверить, что тоже.

Смежные вопросы