【问题标题】:Hosting win32 windows in a WPF app?在 WPF 应用程序中托管 win32 窗口?
【发布时间】:2010-11-24 15:25:43
【问题描述】:

我有一个旧的 c++ win32 应用程序,使用 wpf windows 扩展它确实有效。

但我想做的是有一个 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);
}

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

还是我的想法很疯狂?

【问题讨论】:

  • 也许是时候翻转开关了。将 WPF 应用程序作为主要应用程序。

标签: c++ wpf interop winapi


【解决方案1】:

你看到了吗?:How WPF uses HWNDs

我还建议阅读以下内容: Walkthrough: Hosting a Win32 Control in WPF

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

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

正如@Tergiver 指出的,不需要消息泵。

【讨论】:

  • 酷,好东西 - 但这是用于在 WPF 窗口中托管 win32 控件,不是吗?我想打开一个相当独立的 win32 窗口,但还不太明白,这将如何应用。但我现在有了一个起点,谢谢!
  • 还有一个解决方案,可以在同一页面上的 win32 hwnd 中托管 wpf 页面。
  • 这也不是我想要实现的 :) 但据我了解的信息,我不需要担心消息泵,WPF 管理它!?
  • 它不仅用于控件。在 WPF 中托管 HWND 甚至比在 WPF 中托管 win32 控件更简单。我还建议阅读演练:在 Win32 中托管 WPF 内容。
  • @Sam:Win32 控件和 Win32 窗口之间的唯一区别是窗口样式:WS_CHILD。它们是相同的东西(都是窗户)。无论您在哪个线程上创建窗口,都必须具有消息泵才能使该窗口运行。 WPF 已经有一个带有消息泵的 UI 线程(或者它不会工作),所以是的,WPF 管理它。
猜你喜欢
  • 2011-06-29
  • 1970-01-01
  • 2016-10-06
  • 2020-10-08
  • 1970-01-01
  • 2011-04-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多