我有一个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>
子窗口窗体加载处理程序代码:
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);
(我试过取消设置 WS_POPUP 样式。它没有效果。)