C# 分层(透明)WPF窗口中的Win32本机控件不可见
我想在WPF窗口中托管本机Win32(Qt小部件)控件。 我的问题是,如果我把它放在一个普通的WPF窗口中,一切正常,但是当我将WPF窗口的C# 分层(透明)WPF窗口中的Win32本机控件不可见,c#,wpf,winapi,wpf-interop,C#,Wpf,Winapi,Wpf Interop,我想在WPF窗口中托管本机Win32(Qt小部件)控件。 我的问题是,如果我把它放在一个普通的WPF窗口中,一切正常,但是当我将WPF窗口的allowTransparency设置为true时,本地内容将不再呈现。我制作了一个简单的测试应用程序,它只创建了一个Win32按钮,以确定Qt是否是罪魁祸首,但事实并非如此 这是我的HwndHost实现: using System; using System.Runtime.InteropServices; using System.Windows.Int
allowTransparency
设置为true
时,本地内容将不再呈现。我制作了一个简单的测试应用程序,它只创建了一个Win32按钮,以确定Qt是否是罪魁祸首,但事实并非如此
这是我的HwndHost
实现:
using System;
using System.Runtime.InteropServices;
using System.Windows.Interop;
namespace WpfHwndHostLayeredWindow
{
class NativeButton : HwndHost
{
protected override HandleRef BuildWindowCore(HandleRef hwndParent)
{
var hwnd = PInvoke.User32.CreateWindowEx(
0, // EX_STYLE
"BUTTON",
"Win32 Button",
PInvoke.User32.WindowStyles.WS_CHILD,
0, 0, 100, 100,
hwndParent.Handle,
IntPtr.Zero, // hMenu
new IntPtr(PInvoke.User32.GetWindowLong(hwndParent.Handle, PInvoke.User32.WindowLongIndexFlags.GWLP_HINSTANCE)),
IntPtr.Zero // lParam
);
return new HandleRef(this, hwnd);
}
protected override void DestroyWindowCore(HandleRef hwnd)
{
PInvoke.User32.DestroyWindow(hwnd.Handle);
}
}
}
以及WPF窗口的XAML:
<Window x:Class="WpfHwndHostLayeredWindow.MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
xmlns:local="clr-namespace:WpfHwndHostLayeredWindow"
mc:Ignorable="d"
Title="MainWindow" Height="450" Width="800"
WindowStyle="None" ResizeMode="CanResizeWithGrip" AllowsTransparency="True">
<Grid>
<TextBlock Text="If you see this, the native control doesn't render properly"
HorizontalAlignment="Center"
VerticalAlignment="Center"/>
<local:NativeButton Margin="16"/>
</Grid>
</Window>
我试过设置WS\u EX\u LAYERED
标志,但没有任何效果
是否有任何方法可以使其工作,或者这是WPF/HwndHost的一个(已知)限制?分层窗口是一个将其内容从屏幕上提取出来的窗口。这意味着系统会自动合成和重新绘制分层窗口和底层应用程序的窗口 如果我们将本机窗口嵌入到分层窗口中,由于某些环境中的窗口类型冲突,子窗口内容可能无法绘制
请参见许多旧的显示技术不支持适当的透明度。例如,Windows窗体从未具有“真实”透明度,其中MS aknowleged“Windows窗体控件不支持真实透明度。透明Windows窗体控件的背景由其父控件绘制。”。因此,不可能没有这样的方法。如果没有人有更好的信息,那么你想要的组合是不可能的。因为Windows 2000分层窗口是受支持的,如果你设置
allowsttransparency
,它会在窗口的扩展样式中添加WS_EX_layered标志。这将自动将窗口与下面的所有其他窗口以及桌面背景混合。