gpt4 book ai didi

c# - 使用 HwndHost 在 WPF 中托管外部窗口的正确方法

转载 作者:行者123 更新时间:2023-11-30 15:25:58 30 4
gpt4 key购买 nike

我想在我的 WPF 应用程序中托管一个外部进程的窗口。我像这样派生 HwndHost:

    class HwndHostEx : HwndHost
{
[DllImport("user32.dll")]
static extern IntPtr SetParent(IntPtr hWndChild, IntPtr hWndNewParent);

private IntPtr ChildHandle = IntPtr.Zero;

public HwndHostEx(IntPtr handle)
{
this.ChildHandle = handle;
}

protected override System.Runtime.InteropServices.HandleRef BuildWindowCore(System.Runtime.InteropServices.HandleRef hwndParent)
{
HandleRef href = new HandleRef();

if (ChildHandle != IntPtr.Zero)
{
SetParent(this.ChildHandle, hwndParent.Handle);
href = new HandleRef(this, this.ChildHandle);
}

return href;
}

protected override void DestroyWindowCore(System.Runtime.InteropServices.HandleRef hwnd)
{

}
}

并像这样使用它:

 HwndHostEx host = new HwndHostEx(handle);
this.PART_Host.Child = host;

其中 handle 是我要托管的外部窗口的句柄,PART_Host 是我的 WPF 窗口内的边框:

<StackPanel UseLayoutRounding="True"
SnapsToDevicePixels="True"
Background="Transparent">
<Border Name="PART_Host" />
...

这给了我一个异常(exception):

Hosted HWND must be a child window.

抱歉,我缺乏知识,但在 WPF 应用程序中托管外部窗口的正确方法是什么?

最佳答案

在调用“SetParent”之前执行此操作:

public const int GWL_STYLE = (-16);
public const int WS_CHILD = 0x40000000;

SetWindowLong(this.ChildHandle, GWL_STYLE, WS_CHILD);

关于c# - 使用 HwndHost 在 WPF 中托管外部窗口的正确方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30186930/

30 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com