Windows窗体作为一个非托管的应用程序的子窗口(Windows Form as child wi

2019-08-02 17:35发布

我在寻找一种方式嵌入Windows窗体在C#编写的C ++ Windows应用程序的应用程序。 本机应用程序的主窗口被分成几个窗格。 的C#应用​​程序被认为那些窗格中的一个内出现,即​​,C#组分(最外面的形式)的根窗口必须在主应用程序的一个子窗口。

可以这样做? 如果是这样,怎么样?

一些额外的背景:据我所知,有两种方式来进行此事。 首先,通过使用.NET托管的API(ICLRRuntimeHost等)主办的本机应用程序的CLR。 其次,通过将Windows窗体中的ActiveX控件主办的CLR。

关于第一种方法,我设法让CLR启动和(在很大程度上要归功于加载一个C#组件马蒂亚斯Högström )。 当我打一个路障的是,我看不到出路如何告诉我的,因为它必须从C ++侧通过在一个窗口的孩子CLR运行的组件。

我也尝试用第二个方法(使用ActiveX和感谢丹尼尔Yanovsky )。 它几乎,但只差一点,适合我的目的。 我可以让任意Windows窗体的本机应用程序的一个子窗格中运行的组件。 但他们总是在主应用程序的主线程上运行。 这意味着他们所使用的主要的应用程序的窗口消息循环。 MSDN说,这不会因为标准的Windows消息循环可靠的工作不符合Windows窗体的要求(我想后的链接MSDN这里,但已经用完了我的新用户,双连杆行使超额配股权)。

该消息循环问题,唯一的例外是,根据MSDN,Internet Explorer和MFC应用程序。 我使用的是一台主机的本机应用程序绝对不是Internet Explorer。 此外,它使用Windows API作为包裹由wxWidgets的所以MFC不是(或至少不是一个欢迎)选项。

该解决方案的微软提出了包括让自己的信息运行C#组件自己的线程循环。 这至少据我所知,必然导致回到上面提到的第一种方法。 所以我回得到一个Windows窗体一个传入的父窗口下工作的问题。

同样,我感兴趣的是明确的子窗口的问题,独立的我在这里提到的方法中的任何输入。 但根据上下文我可以在一般问题减小到两个具体问题(我需要一个答案,只是其中之一):

  • 鉴于一个ActiveX控件中承载Windows窗体,我怎么能允许的形式在自己的消息循环在自己的线程上运行?

要么

  • 鉴于Windows窗体中的本机应用程序托管的CLR运行时,如何才能让表格是窗口的子窗口中的本机应用程序?

Answer 1:

是的,是可以做到的。 我们做同样的事情年前。 这是我们的做法:.NET控件也有本地窗口句柄,我们通过C ++ / CLI让这些手柄,并将其传递到Win32和添加这些手柄作为本地Windows的孩子。 因此,主要的应用程序的主线程上运行.NET控件,有问题的部分是消息循环,当你在你的问题提到。 如果需要的话,我们需要路由国家和.NET窗口之间的消息。 正如我记得,我们修复了许多与此相关的bug,并且仍然有我们没弄明白一些神秘问题。

有anothe方式:使用WPF互操作。 http://msdn.microsoft.com/en-us/library/ms742522.aspx 。 根据MS,这样就可以解决信息问题,但我们并没有尝试这种方法。 你可以使用Win32的托管WPF,然后使用WPF托管WinForm的。

所以,为了你最后的2个问题:

  1. 你不能。 只有一个消息循环。
  2. 使用手柄。 这篇文章谈论Windows窗体的句柄: http://blogs.msdn.com/b/jfoscoding/archive/2004/11/24/269416.aspx


文章来源: Windows Form as child window of an unmanaged app
标签: c# c++ winapi clr