WPF ウィンドウで win32 ウィンドウをホストする必要がありますが、ユーザー コントロールのように動作させる必要があります。他のコントロールはそれらの上に表示できる必要があり、タブ コントロールなどに配置できる必要があります。そのようなことは可能ですか?
4 に答える
直接ではありません。 空域の問題がここに適用され、他のコンテンツのように HWND (Win32) ウィンドウを直接使用できなくなります。
このAirspaceOverlay コントロールなど、さまざまな回避策があります。これらは、クロムを使用せずに別の WPF を作成し、Window
それを HWND の上に「オーバーレイ」して、必要に応じて移動することによって機能します。
私の意見では、それは不可能です。
winform ユーザー コントロールを使用してそれを windowsformhost コントロールに配置することもできますが、この場合でも windowsformhost は常に一番上にあり、その上に他のコントロールを配置することはできません。この理由は、AirSpace問題として知られています。
いいえ。せいぜい、ネイティブ ウィンドウを非表示にして、それと WPF コントロール (ala リモート デスクトップ) の間でグラフィックスとユーザー インタラクションを転送することができます。ただし、これは実際には WPF ウィンドウでネイティブ ウィンドウをホストするわけではありません (ネイティブ ウィンドウがその親と対話すると、壊れます)。
これは、すべての WPF コンテンツが 1 つの Win32 ウィンドウ、Win32 の z オーダーの 1 つのスロットにあるためです。そのため、他の WPF コンテンツをこの他の子コントロールの下と上に配置することはできません。
確かに、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を使用して...
「それが役に立てば幸いです...少なくとも少し...