- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
在我的 WPF 应用程序中,我使用 HwndHost 托管 Win32 内容。但是,创建 HwndHost 并不会创建 native 窗口。相反,这是在重写的 BuildWindowCore()
方法中完成的,该方法稍后由 WPF 调用。
我的托管内容需要 native 窗口的窗口句柄来进行自身初始化。不幸的是,我无法强制创建窗口(即让 WPF 调用 BuildWindowCore),因此我有第二个线程轮询 HwndHost 直到它被初始化。
在 .NET 4.0/WPF 4.0 中,添加了新方法 WindowInteropHelper.EnsureHandle()
。我本来希望这能解决这个问题,但它只适用于 Window,而不适用于 HwndHost(它不是从 Window 派生的)。您有什么建议我可以做什么吗?
编辑:
我忘记为可能的解决方案添加更多约束:
最佳答案
似乎没有完美的解决方案。与提出问题时相比,我稍微改变了我的方法:
在我的 HwndHost 派生类的构造函数中,我将(可能的)父 hWnd 作为参数之一。然后,我使用 native CreateWindow()
方法和给定的父 hWnd 创建 native 窗口。我将创建的 hWnd 存储在一个单独的属性中,我在任何地方都使用该属性,而不是 HwndHost 的 Handle 属性。这样,我就不需要显示窗口(这解决了约束#2)。
在重写的 BuildWindowCore()
方法中,我将给定的父 hWnd 与构造函数中给定的 hWnd 进行比较。如果它们不同,我将使用 native SetParent()
方法重新设置我的托管窗口的父级(这解决了约束 #1)。请注意,这依赖于没有人存储父 hWnd!
在代码中,相关部分(检查省略):
public class Win32Window : HwndHost
{
public Win32Window(IntPtr parentHwnd)
{
this.ParentHwnd = parentHwnd;
this.Win32Handle = NativeMethods.CreateWindowEx( /* parameters omitted*/ );
}
public IntPtr Win32Handle { get; private set; }
private IntPtr ParentHwnd { get; set; }
protected override HandleRef BuildWindowCore(HandleRef hwndParent)
{
if (hwndParent.Handle != this.ParentHwnd)
{
NativeMethods.SetParent(this.Win32Handle, hwndParent.Handle);
}
return new HandleRef(this, this.Win32Handle);
}
}
关于.net - 强制初始化 HwndHost,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3871038/
屏幕截图中的图表区域是一个 HwndHost 控件,它承载一个在 C++/CLI 中实现并使用 Direct2D 绘制的 native Win32 窗口(具有自己注册的 WNDCLASS)。 Hwnd
我不确定为什么,但是 HwndHost 上的拖放事件似乎不起作用(实际上似乎根本没有任何事件起作用)。我能够连接到 HwndHost 的 Windows 消息,但是,我似乎找不到任何有用的东西。 我试
在我的 WPF 应用程序中,我使用 HwndHost 托管 Win32 内容。但是,创建 HwndHost 并不会创建 native 窗口。相反,这是在重写的 BuildWindowCore() 方法
我无法确保正确销毁托管窗口。 我有一个 HwndHost 派生类,正在 TabControl 中显示(尽管这可能不相关)。我试图在选项卡关闭时销毁托管内容(而不是在包含的窗口关闭时)。 我目前拥有 m
有没有办法将发生在 HwndHost 上的输入事件(主要是鼠标,但最终也是键盘输入)传递回底层 WPF 控件(例如面板)?我可以在 HwndHost 中连接到 WndProc 并接收 Windows
我想在我的 WPF 应用程序中托管一个外部进程的窗口。我像这样派生 HwndHost: class HwndHostEx : HwndHost { [DllImport
是否可以通过 HwndHost 控件绘制控件?(我不想使用弹出窗口) 此 HwndHost 控件绘制了任何 WPF 控件。据我了解,它不依赖于 ZIndex。(因为 HwndHost 控件是由 COM
我已经考虑了几天,但我认为我对 windows 和 wpf 在内部如何工作以解决这个问题缺乏一些基本的了解。 问题是这样的: 我创建了一个窗口,可以让我在 aero 标题栏(如 office)上绘制
我们有一个桌面 Windows 应用程序,它使用需要显示 HWND 的组件。在 WPF 应用程序中,我们使用 HwndHost 来显示它。我们正在尝试制作一个基于 Qt QML 的应用程序来做同样的事
我们有一个庞大的代码库,用于使用 Qt 在 C++ 中处理和可视化图像。现在用户想要在此基础上进行构建,但他们的代码库是带有 WPF 的 .NET Core 3.1。我们使用 PInvoke 来接口(
我需要在我的 WPF 窗口中承载 win32 窗口,但我需要它们像用户控件一样运行。其他控件需要能够出现在它们之上,并且它们应该能够放入选项卡控件等。这样的事情可能吗? 最佳答案 不直接。 Airsp
我需要在 Windows 窗体控件中托管一个 Win32 窗口。我在使用 WPF 时遇到了同样的问题,我通过使用 HwndHost 控件解决了这个问题。 我遵循了这个教程: Walkthrough:
我是一名优秀的程序员,十分优秀!