我有一個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