我有一个有趣的案例需要解决:
我有一个使用MDI的本机(winapi)应用程序。这个应用程序允许我使用简单的脚本语言扩展自己。脚本在不同于UI线程的线程上启动(尽管我可以获得具有适当功能的UI线程ID)。脚本语言还允许我启动任何c ++代码(通过LoadLibrary)。
我想要实现的是在此应用程序中创建一个新窗口,该窗口可以托管WPF并将其作为MDI子窗口“附加”到MDI客户端(mdi区域)。另外,我希望这个窗口与MDI区域正确“对话”,例如mdi菜单中的窗口更新列表。
到目前为止,我的第一个猜测只是创建一个WinForms窗口,在内部托管WPF,然后尝试通过将MDI客户端设置为其父级来使其成为mdi子窗口(因为我的托管应用程序不是用c#编写的,我只是有句柄,所以我用User32.SetParent()
P / Invoke做了这个。在我将脚本线程附加到GUI线程之后,这几乎运行良好,但我没有遇到任何问题:带有活动窗口的MDI菜单没有更新,窗口没有正确交互(当它不应该等时它停留在停止状态)。
然后,我尝试用SetWindowLongPtr
设置标志(样式,exStyles)。它改变了我的窗口的行为,但那仍然不是它。
现在我正在考虑使用CreateMDIWindow
函数,或者按SendMessage
执行,根据文档发送消息应该创建一个窗口,即使我从不同的线程发送它。问题是,这种方式只会给我一个本机句柄,我找不到任何方式在其中托管WinForms / WPF。
我很好奇是否有人试图做类似的事情并且有任何结果呢?哪种方式最好 - 尝试创建一个WinForms窗口并将其添加到MDI客户端,或者创建一个本机窗口并尝试在其中托管WinForms(任何特定的方式)?
我发现的这个问题的大多数答案都是处理托管应用程序的情况,所以你可以设置.MDIParent
属性,在这种情况下我不敢这样做。