2012-11-14 4 views
6

C#で書かれたWindowsフォームアプリケーションをC++ウィンドウアプリケーションに埋め込む方法を探しています。ネイティブアプリケーションのメインウィンドウは、いくつかのペインに細分されています。 C#アプリケーションは、これらのペインのいずれかに表示されるはずです。つまり、C#コンポーネントのルートウィンドウ(最も外側のフォーム)は、メインアプリケーションの子ウィンドウでなければなりません。Windowsフォームアンマネージドアプリケーションの子ウィンドウとして

これはできますか?もしそうなら、どうですか?

追加のコンテキスト:私の知る限り、これについては2つの方法があります。まず、.netホスティングAPI(ICLRRuntimeHostなど)を使用してネイティブアプリでCLRをホストします。次に、WindowsフォームをActiveXコントロールに配置してCLRをホストします。

最初のアプローチについては、CLRを起動してC#アセンブリをロードすることができました(主にMattias Högströmに感謝します)。私がロードブロックを打っているところは、CLRで実行しているコンポーネントにC++側から渡されたウィンドウの子である必要があることを伝える方法がないということです。

私はまた、ActiveXを使用してDaniel Yanovskyのおかげで2番目の方法で実験しました。それはほとんど、私の目的のためにほとんど機能します。任意のWindowsフォームコンポーネントをネイティブアプリの子ウィンドウで実行できるようにすることができます。しかし、彼らは常にメインアプリのメインスレッドで実行されます。これは、彼らがメインアプリのウィンドウメッセージループを使用することを意味します。 MSDNでは、標準のWindowsメッセージループがWindowsフォームの要件を満たしていないため(このMSDNへのリンクを投稿したいが、既に新しいユーザー2リンクの割り当てを使い切っていたため)、確実に機能しないという。

メッセージループの問題の例外は、MSDN、Internet ExplorerおよびMFCアプリケーションに従っています。私がホストとして使用しているネイティブアプリは、間違いなくInternet Explorerではありません。また、Windows APIをwxWidgetsでラップして使用するため、MFCは(または少なくとも歓迎されない)オプションではありません。

マイクロソフトが提案するソリューションには、C#コンポーネントを独自のスレッドで独自のメッセージループで実行させることが含まれます。これは、少なくとも私が知る限り、必ず上記の最初のアプローチに戻る。だから、Windows Formを渡された親ウィンドウの下で動作させるという問題に戻ります。

私はここで言及したアプローチとは関係なく、子ウィンドウの問題を明確にするすべての入力にも興味があります。しかし、コンテキストの光の中で私は2つの具体的な質問への一般的な質問を減らすことができる(と私は彼らの唯一の答えが必要になります):私はどのように許可することができ、

  • のActiveXコントロールでホストされているWindowsフォームを考えます独自のスレッド上で独自のメッセージループで実行するフォーム?

またはWindowsフォームのネイティブアプリが主催CLRで実行して考えると

  • は、どのように私は、フォームがネイティブアプリで、ウィンドウの子ウィンドウもすることができますか?
+0

これを理解できましたか?また、そのmsdn記事へのリンクは何ですか? –

+0

これにはActiveXは必要ありません。あなたがフォームに電話すると何が起こるのですか?あなたは所有者としてIWin32Window(C++ウィンドウハンドルを返すこのインターフェイスを実装する)を渡すことができ、強力なSetParent APIも知っています:http://msdn.microsoft.com/en-us/library/windows/desktop/ms633541 v = vs.85).aspx –

+0

あなたの返信をありがとう。 @ Dinis Cruz:これは[msdn link](http://msdn.microsoft.com/en-us/library/ms229600.aspx)です。 @Simon私は、Windowsフォームがそのオプションを提供し、ネイティブの親と強く対処できることに気づいていなかったので、親を設定することを実験していません。私はIWin32Windowを詳しく見ていく必要があると思います。時間の制約のため、これをバックバーナーにちょっと入れなければなりませんでした。私は2013年の初めにそれに戻ってくることを願っています。CLRのホスティングのコンテキストでネイティブウィンドウの親を設定しようとすることから始め、何がうまくいくかを投稿します。 – user1824048

答えて

1

はい、できます。私たちは何年も前に同じことをしました。 .NETコントロールにはネイティブウィンドウハンドルがあり、C++/CLIでこれらのハンドルを取得してWin32に渡し、これらのハンドルをネイティブウィンドウの子として追加します。 NETコントロールはメインアプリケーションのメインスレッドで実行されるので、あなたの質問に記載されているように、問題のある部分はメッセージループです。必要に応じて国と.NETの間にメッセージをルーティングする必要があります。私が覚えていたように、これに関連した多くのバグを修正しましたが、まだわからなかった不思議な問題がありました。

ちょっとしたことがあります:WPF interopを使用しています。 http://msdn.microsoft.com/en-us/library/ms742522.aspx。 MSによると、これはメッセージの問題を解決するはずですが、このアプローチは試していません。 Win32を使用してWPFをホストし、次にWPFを使用してWinformをホストすることができます。あなたの最後の2つの質問のための

ので:

  1. あなたがすることはできません。 1つのメッセージループのみ。
  2. ハンドルを使用してください。この記事では、Windowsフォームのハンドルについて説明します。http://blogs.msdn.com/b/jfoscoding/archive/2004/11/24/269416.aspx
+0

2への記事は非常に興味深いです。私はもっ​​とWin32/C++の人であり、.net要素が根底にある(?)win32宇宙にどれくらい緊密に関係しているのかよく分かりません。その記事は次のような方向を指しています。フォームはまだ非常に大きなウィンドウです。私がこれを続けていくと、フォームを「通常の」子ウィンドウとして扱い、CLRが没入しないことを望むという観点から始めます。 – user1824048

関連する問題