在WPF应用程序中托管win32窗口?

4
我有一个遗留的C++ Win32应用程序,使用WPF窗口进行扩展是可行的。
但我想要的是将WPF窗口作为主窗口,而不仅仅是任何旧窗口,而是Prism Shell窗口。
所以,在我的遗留C++项目中,我想添加引导程序、Shell窗口、MEF加载器以及所有必要的功能。在其中,我想放置一些命令,当它们需要时打开遗留的Win32窗口。
现在,在Win32应用程序中打开WPF窗口很简单,我只需要使用:
System::Windows::Forms::Integration::ElementHost::EnableModelessKeyboardInterop(mywindow);

但是我如何在WPF应用程序中打开一个win32窗口?win32窗口将需要一个消息泵循环,但我应该把它放在哪里呢?
MSG  msg;
while (GetMessage(&msg, NULL, NULL, NULL))
{
  TranslateMessage(&msg);
  DispatchMessage(&msg);
}

我能否为循环创建任何新线程?还是需要这方面的Interop帮助程序?

或者我的想法纯粹是疯狂的?


也许该转换一下,把 WPF 应用设为主应用。 - Hans Passant
1个回答

5
你看过这个吗?: WPF如何使用HWNDs 我还建议阅读这篇文章: 演练:在WPF中托管Win32控件 正如你所看到的,有一个包含控件的主机窗口。主机窗口也可以包含自绘内容或任何你想要的东西。
你必须从HwndHost重写WndProc。也许可以从那里转发到你的本地处理程序。但我还没有做过。
正如@Tergiver指出的那样,没有必要使用消息泵。

很酷,很好的东西 - 但这是用于在WPF窗口中托管win32控件,不是吗?我想打开一个相当独立的win32窗口,但还不太明白如何应用。但现在我有了一个起点,谢谢! - Sam
还有一种解决方案,可以在同一页上的win32 hwnd中托管wpf页面。 - frast
这也不是我想要实现的 :) 但据我所知,我不需要担心消息泵,WPF会管理它!? - Sam
它不仅适用于控件。在WPF中托管HWND甚至比在WPF中托管win32控件更简单。我还建议阅读Walkthrough:在Win32中托管WPF内容。 - frast
3
@Sam: Win32 控件和 Win32 窗口之间唯一的区别是窗口样式:WS_CHILD。它们本质上都是窗口。创建窗口的任何线程都必须有一个消息泵才能使窗口正常工作。WPF 已经有一个带有消息泵的 UI 线程(否则它就不会工作),因此,是的,WPF 管理了这个过程。 - Tergiver

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接