4

メイン アプリケーションとして実行されている C++ アプリがあります。.NET アプリも並行して実行されており、ソケットを介してプロセス間通信を行っています。C++ アプリの上に .NET メイン フォームを維持するにはどうすればよいですか?

方法:

  • 現在設定TopMost = trueしていますが、別のアプリケーションを開くと問題が発生します。.NET アプリが他のすべてのアプリの上に表示されます。

  • もう 1 つの方法はLostFocus、ユーザーが C++ アプリをクリックした場合は .NET アプリをフォアグラウンドに移動し、ユーザーが別のアプリに切り替えた場合は何もしないことを確認することです。

何か案は?これは以前に行われたことがありますか?Paint.NET でも同様の効果が見られました。ツール パレットは他のウィンドウの上に表示されたままです。

ペイントネット

4

1 に答える 1

4

表示する前に、C++ ウィンドウを .NET フォームの所有者にしてみましたか? ウィンドウ ハンドルはセッション グローバルであるため、IPC を介して通信できます。また、ShowIWin32Windowメソッドは任意の所有者を受け入れます。MSDN ページから:

フォームが別のフォームによって所有されている場合、そのフォームは所有者フォームと共に閉じられるか、非表示になります。たとえば、Form1 というフォームが所有する Form2 というフォームがあるとします。Form1 が閉じているか最小化されている場合、Form2 も閉じているか非表示になっています。所有されているフォームも、所有者フォームの背後に表示されることはありません。

コメントへの返信:

たぶん、これは十分に明確ではありませんでした:Ownerプロパティは typeであるため、フォームが表示されるとオブジェクトFormを割り当てることはできません。IWin32Windowただし、所有者パラメーターForm.Show 受け入れるため、IWin32Window最初にフォームを表示するときに所有者を任意のウィンドウに設定できます。私が見るForm.Show限り、Reflector で調べたところIWin32WindowForm.

への最初の呼び出しより後にウィンドウ所有者を設定する必要がある場合Form.Showは、おそらく PInvoke が必要になるでしょうSetWindowLong(この回答で説明されているように)。それForm.Showもそうです。

于 2012-04-25T09:12:46.617 に答える