小编use*_*048的帖子

Windows窗体作为非托管应用程序的子窗口

我正在寻找一种方法来嵌入用C#编写的Windows窗体应用程序在C++窗口应用程序中.本机应用程序主窗口细分为多个窗格.C#app应该出现在其中一个窗格中,即C#组件的根窗口(最外面的窗体)必须是主应用程序的子窗口.

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

一些额外的背景:据我所知,有两种方法可以解决这个问题.首先,使用.net托管API(ICLRRuntimeHost等)在本机应用程序中托管CLR.其次,通过将Windows窗体放在ActiveX控件中来托管CLR.

关于第一种方法,我设法启动CLR并加载C#程序集(主要归功于MattiasHögström).在我遇到障碍的地方是我看不出如何告诉我在CLR中运行的组件它需要是从C++端传入的窗口的子代.

我还尝试了第二种方法(使用ActiveX并感谢Daniel Yanovsky).它几乎,但只是差不多,适合我的目的.我可以让任意Windows窗体组件在本机应用程序的子窗格中运行.但它们总是在主应用程序的主线程上运行.这意味着他们使用主应用程序的Windows消息循环.MSDN说这不会可靠地工作,因为标准的Windows消息循环不符合Windows窗体的要求(我想在这里发布到MSDN的链接,但已经用完了我的新用户双链接分配).

根据MSDN,Internet Explorer和MFC应用程序的消息循环问题的例外情况.我作为主机使用的本机应用程序绝对不是Internet Explorer.此外,它使用由wxWidgets包装的Windows API,因此MFC不是(或至少不是受欢迎的)选项.

Microsoft提出的解决方案涉及让C#组件在自己的线程上运行自己的消息循环.至少据我所知,这必然会导致回到上面提到的第一种方法.所以我回到了让Windows窗体在传入的父窗口下工作的问题.

同样,我对任何澄清子窗口问题的输入感兴趣,与我在这里提到的方法无关.但根据上下文,我可以将一般性问题减少到两个具体问题(我只需要对其中一个问题给出答案):

  • 给定在ActiveX控件中托管的Windows窗体,如何允许窗体在其自己的线程上的自己的消息循环中运行?

要么

  • 给定在本机应用程序托管的CLR中运行的Windows窗体,如何使窗体成为本机应用程序中窗口的子窗口?

c# c++ clr winapi

7
推荐指数
1
解决办法
2590
查看次数

标签 统计

c# ×1

c++ ×1

clr ×1

winapi ×1