サードパーティの実行中のアプリケーションでウィンドウのオーバーレイとして動作する必要がある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 スタイルの設定を解除しようとしましたが、効果はありません。)