加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 综合聚焦 > 服务器 > Windows > 正文

在第7方应用程序中托管的WPF子窗口在Windows 7 Aero主题上不可见

发布时间:2020-12-13 22:25:56 所属栏目:Windows 来源:网络整理
导读:我有一个 WPF窗口,它必须在第三方运行的应用程序中表现为窗口的叠加.我的WPF窗口必须大部分是透明的,带有一些可见的控件,总是位于z顺序的另一个窗口的顶部,随之移动等等.简而言之:我希望它的行为就像一个子窗口. 我已经回顾了here(WPF HwndSource技术)和her
我有一个 WPF窗口,它必须在第三方运行的应用程序中表现为窗口的叠加.我的WPF窗口必须大部分是透明的,带有一些可见的控件,总是位于z顺序的另一个窗口的顶部,随之移动等等.简而言之:我希望它的行为就像一个子窗口.

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

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

我的测试应用程序创建一个测试窗口并调用SetParent使其成为Notepad窗口(硬编码的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" 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样式.它没有效果.)

解决方法

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

请注意,在.NET 3.5中,如果您在任何“子”窗口的事件处理程序中执行此操作,即使早在OnSourceInitialized,窗口所有者也不会真正设置.显然,在那时设置所有者为时已晚.

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

>杰克

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读