gpt4 book ai didi

Wpf 和 Hwnd 唯一名称

转载 作者:行者123 更新时间:2023-12-04 22:00:52 25 4
gpt4 key购买 nike

我们有一个 wpf 应用程序,它应该由遗留 win32 winform 应用程序“引导”。 (我们不拥有代码;))

遗留应用程序应通过我们应提供的 Windows 类名称来引导我们的应用程序(最小化、置于最前面、关闭等),我们应将其作为写入 ini 文件的配置参数提供。

问题是我们不能让它与 wpf 一起工作,因为如果我们插入 Spy++ 给我们的类名,什么也不会发生。重点是 Spi++ 返回类似这样的东西

 HwndWrapper[MyWpfProgram.exe;;16978ce2-3b8d-4c46-81ee-e1c6d6de4e6d]

每次运行时随机生成 guid。

有什么办法可以解决这个问题吗?

谢谢。

最佳答案

没有办法按照我的要求去做。但是我们找到了解决方法。 “简单地”将 xaml 窗口嵌入到窗口窗体中。

这些是我们遵循的步骤:

1 - 向项目添加 Windows 窗体。

2 - 删除 app.xaml 并使新表单成为应用程序的入口点。

3 - 因为我们需要 main.xaml 的 hwnd,所以我们将这个 Prop 添加到它的代码后面

    public IntPtr Hwnd
{
get { return new WindowInteropHelper(this).Handle; }
}

4 - 然后我们从窗体的构造函数创建 wpf 窗口类的实例

    private Main app;
public ContainerForm()
{
InitializeComponent();

app = new Main();
ElementHost.EnableModelessKeyboardInterop(app);
}

我们需要

 ElementHost.EnableModelessKeyboardInterop(app);

因为我们希望所有键盘输入都从 windows 窗体传递到 xaml 窗口

5 - 现在我们要将 xpf 窗口绑定(bind)到 winform。为此,我们需要使用 Windows Api,并且我们在窗体的 OnShow 事件中执行此操作(稍后将解释原因)。

    [DllImport("user32.dll", SetLastError = true)]
private static extern long SetFocus(IntPtr hWnd);

[DllImport("user32.dll", SetLastError = true)]
private static extern long SetParent(IntPtr hWndChild, IntPtr hWndNewParent);


[DllImport("user32.dll", SetLastError = true)]
private static extern bool MoveWindow(IntPtr hwnd, int x, int y, int cx, int cy, bool repaint);

[DllImport("user32.dll", EntryPoint = "SetWindowLongA", SetLastError = true)]
private static extern long SetWindowLong(IntPtr hwnd, int nIndex, long dwNewLong);
private const int GWL_STYLE = (-16);
private const int WS_VISIBLE = 0x10000000;

private void ContainerForm_Shown(object sender, EventArgs e)
{
app.Show();
SetParent(app.Hwnd, this.Handle);
SetWindowLong(app.Hwnd, GWL_STYLE, WS_VISIBLE);
MoveWindow(app.Hwnd, 0, 0, this.Width, this.Height, true);

SetFocus(app.Hwnd);
}

 SetParent(app.Hwnd, this.Handle);

我做魔术,然后用

  SetWindowLong(app.Hwnd, GWL_STYLE, WS_VISIBLE);

我们从 wpf 窗口中删除了所有的 chrome(即使窗口定义为无边框,也有边框,不要问我为什么)

然后我们让wpf窗口填满winform的所有客户区

  MoveWindow(app.Hwnd, 0, 0, this.Width, this.Height, true);

然后我们聚焦wpf窗口

 SetFocus(app.Hwnd);

这就是我们在展会事件中竭尽全力的原因。因为如果我们在窗体的构造函数中执行此操作,那么 wpf 窗口将失去焦点,因为在 winform 中主窗口从操作系统获得焦点。

我们不明白为什么我们需要在此时添加其他 api 调用,但如果我们将它们留在构造函数中,这个技巧就不起作用了。

无论如何,问题解决了;)

关于Wpf 和 Hwnd 唯一名称,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18103738/

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