#.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) перечислить все используемые дескрипторы окна, затем понаблюдать за новым.