Поиск дескриптора окна WPF

109

У форм Windows было свойство win1.Handle, которое, если я помню, возвращает дескриптор дескриптора главного окна?

Есть ли эквивалентный способ получить дескриптор окна WPF?

Я нашел в Интернете следующий код,

IntPtr windowHandle = new WindowInteropHelper(Application.Current.MainWindow).Handle;

но я не думаю, что это поможет мне, потому что в моем приложении много окон.

Спасибо!!

Эван
источник
24
Позвольте дать вам дружеский совет, Эван. Не занимайтесь программированием культа карго! Разберите код, который вы нашли в Интернете. Вы можете ясно видеть, что он передает Application.Current.MainWindow, и, исходя из этого, вы можете предположить, что, передав ему ссылку на другое окно, вы получите свой ответ. Я никогда не использовал WindowInteropHelper, но все же смог ответить на вопрос, просто рассуждая.
Грегори Хигли,
1
ты прав, спасибо! я устала сегодня :).
Эван
5
Нет проблем! И я не имел в виду критику, просто чтобы быть полезным. Мы все время от времени занимаемся небольшим грузом. :)
Грегори Хигли

Ответы:

142

Что ж, вместо передачи Application.Current.MainWindowпросто передайте ссылку на любое окно, которое вам нужно: new WindowInteropHelper(this).Handleи так далее.

Грегори Хигли
источник
Я только что обнаружил, что общий диалог FileSave принимает ссылку на окно верхнего уровня, поэтому вы можете передать, например, ссылку на MainWindow приложения. Сохраните сервисы Interop на тот момент, когда они вам действительно понадобятся.
Дэвид А. Грей
39

Просто используйте свое окно с классом WindowsInteropHelper:

// ... Window myWindow = get your Window instance...
IntPtr windowHandle = new WindowInteropHelper(myWindow).Handle;

Прямо сейчас вы запрашиваете главное окно приложения, одно из которых всегда будет. Вы можете использовать тот же метод для любого окна, однако, при условии, что это класс Window, производный от System.Windows.Window.

Рид Копси
источник
8

ты можешь использовать :

Process.GetCurrentProcess().MainWindowHandle
Амер Саван
источник
3

Если вам Windowпо какой-то причине нужны оконные дескрипторы для ВСЕХ приложений вашего приложения , вы можете использовать это Application.Windowsсвойство для доступа ко всем окнам, а затем использовать их WindowInteropHandlerдля доступа к их дескрипторам, как вы уже продемонстрировали.

Dustyburwell
источник