我有一个WPF窗口,它必须作为第三方运行应用程序中窗口的叠加。我的WPF窗口必须大部分都是透明的,并且有一些可见的控件,它们总是以z顺序位于其他窗口的顶部,随它一起移动等。简而言之:我希望它像一个子窗口那样工作。WPF子窗口托管在第三方应用程序在Windows 7上不可见Aero主题
我回顾了here(WPF HwndSource技术)和here(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样式。它不起作用。)
只是一个想法,你尝试过用测试(说的calc.exe)比记事本以外的任何窗口?我现在无法访问Windows 7个人电脑,但是我可以用记事本重现问题,但不能使用calc.exe,在Windows 8上使用您的代码。在Win8上,使用您的代码,子窗口会显示在记事本中,但只要我激活记事本的窗口,子窗口变得不可见,所以我想记事本可能会将文本框保留在其他所有子项的顶部。 – 2013-04-10 14:27:41
嗯......谢谢你的这个想法,@AndreiPana。我将用其他窗口进行测试,并检查Windows 8的工作原理。 – 2013-04-10 19:38:52