2011-10-18 19 views
5

Tôi cần áp dụng hiệu ứng làm mờ nền Aero cho một phần của cửa sổ WPF có hình tùy chỉnh. Vấn đề là để áp dụng hiệu ứng mờ với DWM, tôi cần cung cấp một tay cầm cửa sổ cho hàm DwmEnableBlurBehindWindow.Có thể nhận được điều khiển Hwnd của WPF Popup không?

Tôi đã được thông báo rằng điều khiển bật lên WPF thực sự là một cửa sổ riêng biệt. Điều đó tốt. Tôi có thể có được trình xử lý của cửa sổ bật lên để áp dụng hiệu ứng mờ cho nó không? Nếu vậy, làm thế nào?

Trả lời

8

Hãy thử điều này

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

hay này nhưng điều này chỉ hoạt động cho thực tế Windows, nhưng có thể giúp đỡ để tham khảo trong tương lai.

IntPtr handle = new WindowInteropHelper(myWindow).Handle; 
+1

Bạn nên vượt qua 'myPopup.Child' cho 'HwndSource.FromVisual()' như trong câu trả lời của Cleber. Nếu không, bạn sẽ nhận được HwndSource của cha mẹ của Popup (đó là cửa sổ cha của bạn, nơi Popup được khai báo trong XAML). Nhưng nếu bạn vượt qua 'myPopup.Child', bạn sẽ nhận được một cửa sổ được tạo bởi Popup. – nevermind

0

Địa chỉ có tên lớp tùy chỉnh không? Nếu vậy, bạn có thể Tìm cửa sổ xử lý thông qua tên lớp (FindWindow).

Tôi là một loại hacker khi nói đến công cụ này trong Windows, vì vậy đó là những gì tôi thường cố gắng trước tiên, thay vì cố gắng khám phá phương pháp "thích hợp". Tất cả những thứ cũ cho tôi, mặc dù, tôi không làm nhiều việc này nữa - xem blackbeltvb.com

Hai cách khác tôi đã thực hiện việc này là 1) để treo các thông báo tạo cửa sổ, xem cửa sổ bật lên , sau đó làm điều gì đó với nó (SetWindowsHookEx) và 2) liệt kê tất cả các cửa sổ xử lý đang được sử dụng, sau đó xem cho cái mới.

8

Hãy thử điều này:

<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;