2013-04-08 51 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

相關問題