2

WPF ウィンドウで win32 ウィンドウをホストする必要がありますが、ユーザー コントロールのように動作させる必要があります。他のコントロールはそれらの上に表示できる必要があり、タブ コントロールなどに配置できる必要があります。そのようなことは可能ですか?

4

4 に答える 4

3

直接ではありません。 空域の問題がここに適用され、他のコンテンツのように HWND (Win32) ウィンドウを直接使用できなくなります。

このAirspaceOverlay コントロールなど、さまざまな回避策があります。これらは、クロムを使用せずに別の WPF を作成し、Windowそれを HWND の上に「オーバーレイ」して、必要に応じて移動することによって機能します。

于 2013-01-28T21:59:14.407 に答える
1

私の意見では、それは不可能です。

winform ユーザー コントロールを使用してそれを windowsformhost コントロールに配置することもできますが、この場合でも windowsformhost は常に一番上にあり、その上に他のコントロールを配置することはできません。この理由は、AirSpace問題として知られています。

于 2013-01-28T21:58:22.597 に答える
0

いいえ。せいぜい、ネイティブ ウィンドウを非表示にして、それと WPF コントロール (ala リモート デスクトップ) の間でグラフィックスとユーザー インタラクションを転送することができます。ただし、これは実際には WPF ウィンドウでネイティブ ウィンドウをホストするわけではありません (ネイティブ ウィンドウがその親と対話すると、壊れます)。

これは、すべての WPF コンテンツが 1 つの Win32 ウィンドウ、Win32 の z オーダーの 1 つのスロットにあるためです。そのため、他の WPF コンテンツをこの他の子コントロールの下と上に配置することはできません。

于 2013-01-28T21:58:43.720 に答える
0

確かに、Win32 ウィンドウを WPF API に埋め込むことは可能です。例えば:

別のアプリケーションから Window を WPF ウィンドウにユーザー コントロールとして埋め込む方法は?

Process p = Process.Start(@"application.exe");

p.WaitForInputIdle();
IntPtr appWin = p.MainWindowHandle;

SetParent(appWin, parent);
SetWindowLong(appWin, GWL_STYLE, WS_VISIBLE);
System.Threading.Thread.Sleep(100);
MoveWindow(appWin, 0, 0, ClientRectangle.Width, ClientRectangle.Height, true);

Q: あなたの WPF UI は、この (低レベルの) ウィンドウを「認識」しますか?
A: いいえ - もちろん違います :)

Q: "hWndHost なし" とはどういう意味ですか?
上記のようなコードを使いたくないということであれば、おそらくSOLでしょう。少なくともWPFを使用して...

「それが役に立てば幸いです...少なくとも少し...

于 2013-01-28T21:58:57.573 に答える