Возможно ли получить Hwnd всплывающего элемента управления WPF?

#.net #wpf #api #popup #handle

#.net #wpf #API #всплывающее #обрабатывать

Вопрос:

Мне нужно применить размытие фона Aero только к части окна WPF пользовательской формы. Проблема в том, что для применения размытия с помощью DWM мне нужно предоставить дескриптор окна для DwmEnableBlurBehindWindow функции.

Мне сказали, что всплывающий элемент управления WPF на самом деле является отдельным окном. Это хорошо. Могу ли я получить дескриптор всплывающего окна, чтобы применить к нему размытие? Если да, то как?

Ответ №1:

Попробуйте это:

 <Popup Name="MyPop" IsOpen="True" Height="50" Width="50">
    <!--or other control-->
    <Rectangle/> 
</Popup>


// only after MyPop.IsOpen is true
IntPtr handle =  ((HwndSource)PresentationSource.FromVisual(MyPop.Child)).Handle;
  

Ответ №2:

Попробуйте это

 HwndSource source = (HwndSource)HwndSource.FromVisual(myPopup)
  

или это, но это работает только для реальной Windows, но может помочь для будущих ссылок.

 IntPtr handle = new WindowInteropHelper(myWindow).Handle;
  

Комментарии:

1. Вы должны передать myPopup.Child в HwndSource.FromVisual() , как в ответе Клебера. В противном случае вы получите HwndSource родительского окна Popup (которое является вашим родительским окном, где Popup было объявлено в XAML). Но если вы передадите myPopup.Child , вы получите окно, созданное всплывающим окном.

Ответ №3:

Есть ли у него пользовательское имя класса? Если да, вы можете найти дескриптор окна через имя класса (FindWindow).

Я немного хакер, когда дело доходит до этого материала в Windows, так что это то, что я обычно пробую в первую очередь, вместо того, чтобы пытаться найти «правильный» метод. Для меня это все старое, хотя я этим больше не занимаюсь — смотрите blackbeltvb.com

Два других способа, которыми я это сделал, — это 1) подключить сообщения о создании Windows, понаблюдать за этим всплывающим окном, затем что-то с ним сделать (SetWindowsHookEx) и 2) перечислить все используемые дескрипторы окна, затем понаблюдать за новым.