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

Sam*_*Sam 4 c++ wpf winapi interop

我有一个遗留的c ++ win32应用程序,并使用wpf windows扩展它确实有效.

但我想要做的是将WPF窗口作为主窗口,而不仅仅是任何旧窗口而是棱镜外壳窗口.

所以对于我的遗留c ++项目,我想添加一个Bootstrapper,shell窗口,MEF加载器,所有的铃声和​​口哨声.在那里,我想放置一些命令,在需要时打开传统的win32窗口.

现在在win32应用程序中打开WPF窗口很简单,我只需要使用

System::Windows::Forms::Integration::ElementHost::EnableModelessKeyboardInterop(mywindow);
Run Code Online (Sandbox Code Playgroud)

但是如何在WPF应用程序中打开win32窗口?win32窗口需要一个消息泵循环,但我在哪里放这个:

MSG  msg;
while (GetMessage(&msg, NULL, NULL, NULL))
{
  TranslateMessage(&msg);
  DispatchMessage(&msg);
}
Run Code Online (Sandbox Code Playgroud)

我可以为循环创建任何新线程吗?或者是否也有这样的互操作助手?

或者我的想法是疯了吗?

fra*_*ast 5

你见过这个吗?:WPF如何使用HWND

我还建议阅读: 演练:在WPF中托管Win32控件

正如您将看到的那样,有一个包含控件的主机窗口.主机窗口还可以包含自绘内容或任何您想要的内容.

你必须从HwndHost覆盖WndProc.也许可以从那里转发到您的本地处理程序.还没有那样做.

正如@Tergiver指出的那样,不需要消息泵.

  • @Sam:Win32控件和Win32窗口之间的唯一区别是窗口样式:WS_CHILD.它们是相同的东西(都是窗户).无论您在哪个线程上创建窗口,都必须有一个消息泵才能使该窗口生效.WPF已经有一个带有消息泵的UI线程(或者它不起作用),所以是的,WPF管理它. (3认同)