6

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

4

1 に答える 1

3

SetParent を使用する代わりに、WPF の「子」ウィ​​ンドウの WindowInteropHelper.Owner を上に表示するウィンドウに設定します。

.NET 3.5 では、「子」ウィ​​ンドウのイベント ハンドラーのいずれかでこれを行うと、OnSourceInitialized の初期段階であっても、ウィンドウの所有者は実際には設定されないことに注意してください。どうやら、その時点で所有者を設定するには遅すぎるようです。

代わりに、Show() を呼び出す前に、ウィンドウを作成するコードで Owner を設定します。.NET 4 では、SourceInitialized 内から所有者を設定できるようです。

  • ジャック
于 2013-04-12T08:02:28.913 に答える