Udi*_*-On 6 wpf winapi aero childwindow windows-7
我有一个WPF窗口,它必须表现为第三方正在运行的应用程序中窗口的叠加.我的WPF窗口必须大部分是透明的,带有一些可见的控件,总是位于z顺序的另一个窗口的顶部,随之移动等等.简而言之:我希望它的行为就像一个子窗口.
我已经回顾了这里提供的技术(WPF HwndSource技术)和这里(WPF SetParent技术).HwndSource技术根本不起作用.SetParent技术适用于Windows 7,但仅适用于基本主题.使用Windows 7 Aero主题时,它不起作用:我的子窗口是不可见的.
我正在寻找一个适用于所有Windows 7主题的解决方案.
我的测试应用程序创建一个测试窗口并调用SetParent使其成为记事本窗口(硬编码的HWND)的子窗口.
在基本主题下,它看起来像这样:

在Windows 7主题下,我没有看到它:

子窗口XAML:
<Window x:Class="WpfApplication22.TestWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Title="TestWindow" Height="300" Width="300" Background="#63000000" ShowInTaskbar="False" WindowStyle="None" Initialized="Window_Initialized" Loaded="Window_Loaded" AllowsTransparency="True">
<Grid>
<Ellipse Height="87" HorizontalAlignment="Left" Margin="12,12,0,0" Name="ellipse1" Stroke="Black" VerticalAlignment="Top" Width="167" Fill="#FFBE3A3A" />
</Grid>
</Window>
Run Code Online (Sandbox Code Playgroud)
子窗口表单加载处理程序代码:
var parentHwnd = new IntPtr(0x01DE0DFC); // Running Notepad
var guestHandle = new WindowInteropHelper(this).Handle;
var style = WS_VISIBLE | WS_CLIPSIBLINGS | WS_CHILD | WS_POPUP;
SetWindowLong(guestHandle, GWL_STYLE, (int)(style));
SetParent(guestHandle, parentHwnd);
Run Code Online (Sandbox Code Playgroud)
(我尝试取消设置WS_POPUP样式.它没有效果.)
不要使用 SetParent,而是将 WPF“子”窗口的 WindowInteropHelper.Owner 设置为要在上面显示的窗口。
请注意,在 .NET 3.5 中,如果您在任何“子”窗口的事件处理程序中执行此操作,即使早于 OnSourceInitialized,窗口所有者也不会真正设置。显然,到那时设定所有者为时已晚。
相反,请在调用 Show() 之前在创建窗口的代码中设置 Owner。.NET 4 似乎允许从 SourceInitialized 中设置 Owner。
| 归档时间: |
|
| 查看次数: |
1252 次 |
| 最近记录: |