2013-04-08 47 views
6

我有一个WPF窗口,它必须作为第三方运行应用程序中窗口的叠加。我的WPF窗口必须大部分都是透明的,并且有一些可见的控件,它们总是以z顺序位于其他窗口的顶部,随它一起移动等。简而言之:我希望它像一个子窗口那样工作。WPF子窗口托管在第三方应用程序在Windows 7上不可见Aero主题

我回顾了here(WPF HwndSource技术)和here(WPF SetParent技术)提供的技术。 HwndSource技术根本不起作用。 SetParent技术适用于Windows 7,但只适用于基本主题。有Windows 7 Aero主题,它不起作用:我的子窗口是不可见的。

我正在寻找一种适用于所有Windows 7主题的解决方案。

我的测试应用程序创建一个测试窗口并调用SetParent使其成为窗口的硬编码HWND的子窗口。

在基本主题,它看起来像这样:

Basic Theme

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

Aero Theme

子窗口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样式。它不起作用。)

+1

只是一个想法,你尝试过用测试(说的calc.exe)比记事本以外的任何窗口?我现在无法访问Windows 7个人电脑,但是我可以用记事本重现问题,但不能使用calc.exe,在Windows 8上使用您的代码。在Win8上,使用您的代码,子窗口会显示在记事本中,但只要我激活记事本的窗口,子窗口变得不可见,所以我想记事本可能会将文本框保留在其他所有子项的顶部。 – 2013-04-10 14:27:41

+0

嗯......谢谢你的这个想法,@AndreiPana。我将用其他窗口进行测试,并检查Windows 8的工作原理。 – 2013-04-10 19:38:52

回答

3

而不是使用SetParent,将WPF“子”窗口的WindowInteropHelper.Owner设置为您想在上面显示的窗口。

请注意,在.NET 3.5中,如果您在任何“子”窗口的事件处理程序中执行此操作,即使早于OnSourceInitialized,窗口所有者也不会真正设置。显然,在这一点上设立一个业主已经太迟了。

相反,在调用Show()之前,在创建窗口的代码中设置Owner。 .NET 4似乎允许从SourceInitialized中设置所有者。

  • 杰克
+0

谢谢杰克!这工作完美。 – 2013-04-12 09:09:27

+0

我有类似的问题,但似乎我无法通过调用'this.Owner = HwndSource.FromHwnd(hwnd_notepad).RootVisual as Window;'来访问记事本窗口。你是怎么做到的? – Benj 2015-07-19 15:55:03

相关问题