問題タブ [hwndhost]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
c# - WM_INPUT キーボード メッセージを HWNDHOST アプリケーションに送信する
私はまだ C# と WPF に慣れていません。学習演習として、アンマネージの win32 C++ アプリケーションで WPF の単純なラッパーを作成しています。HWNDHOST
現在、WPF コントロールを使用してホストされているアンマネージド アプリケーションがありWM_INPUT
、マウス入力のメッセージを受信していますが、キーボード入力WM_KEYUP/DOWN
に関しては、キーボードのメッセージしか受信していませんが、メッセージは受信していませんWM_INPUT
。
残念ながら、ホストされたアプリケーションは排他的に使用するため、キーボード入力システムが機能するにRawInput
はメッセージが必要です。WM_INPUT
アプリをホストするための C# コードは次のとおりです。
WM_INPUT
ホストされているアプリケーションに対してキーボード メッセージが生成されない理由と、それを修正する方法/修正方法を誰か教えてもらえますか?
wpf - マウスを使用した HwndHost の移動 (ドラッグ)
これが私が達成しようとしていることです-子WebアプリケーションをホストできるWPFでMDIアプリケーションを作成すること。Web アプリケーションをレンダリングするために WPF Web ブラウザー コントロールを使用しています。WPF は本質的に MDI アプリケーションをサポートしていないようです。そのため、少し検索した結果、UI コントロールを使用してウィンドウをシミュレートし、WPF キャンバス内でそれらを管理するこのプロジェクトを見つけました。このアプローチは、webbrowser コントロール オブジェクトを MDI 子として追加し始めるまでは、うまく機能しているようです。
Web ブラウザー コントロールを MDI 子として追加すると、他の MDI 子コントロールを含む他の WPF 要素の上に常に表示されます (以下を参照)。私が理解していることから、webbrowser コントロールは常に、ウィンドウ (およびポップアップ) を除く他の WPF オブジェクトの上に表示されます。それが本当であると仮定すると、問題の重複を避けるために実際の WPF ウィンドウを使用する必要があると思います。
私が今考えることができる唯一の解決策は、WPF ウィンドウを HwndHost オブジェクト内にラップし、それを MDI 子として追加することです。ただし、子ウィンドウにはタイトル バーを設定できないようです。つまり、以下に示すように、ダミーのタイトル バー領域 (実際のウィンドウのタイトル バーと同じ) と実際のコンテンツ領域 (Web ブラウザー コントロールを表示) を持つウィンドウが必要です (赤い枠は HwndHost オブジェクトです)。
このアプローチは、重複の問題を解決するようです。次に試す必要があるのは、ユーザーがダミーのタイトル バーをクリックして、キャンバス要素内に MDI ウィンドウをドラッグできるようにすることです。
質問 -
- WPF webbrowser コントロールのオーバーラップ動作についての私の理解は正しいですか? そうでない場合、何が欠けていますか?
- 2番目のアプローチは、私が望むものを達成するための正しい方向への一歩ですか? はいの場合、HwndHost のドラッグ動作を実装するにはどうすればよいですか?
- 私が試すことができる他の代替ソリューションはありますか?
ノート:
多くの人が MDI は洗練されたソリューションではないと考えていますが、私には選択の余地がありません。(タブ付きウィンドウ/ドッキング可能ウィンドウなどの代替ソリューションを試しましたが、好評ではありませんでした)
私は相互運用プログラミングにまったく慣れておらず、概念をよく理解していません。私が物事を誤解している場合は、私を修正してください。
ありがとう!
c# - HwndHost を使用して WPF 内で外部ウィンドウをホストする適切な方法
WPF アプリケーション内で外部プロセスのウィンドウをホストしたいと考えています。私はHwndHost
このように導出しています:
そしてそれを次のように使用します:
ここhandle
で、ホストしたい外部ウィンドウのハンドルでありPART_Host
、WPF ウィンドウ内の境界線です。
これは私に例外を与えます:
私の知識不足で申し訳ありませんが、WPF アプリケーション内で外部ウィンドウをホストする適切な方法は何ですか?
wpf - wpf のホストされたプロセスで WndProc が呼び出されない
次の手順に従います。
MSDN のウォークスルー ( https://msdn.microsoft.com/en-us/library/ms752055.aspx )
コンソール アプリケーションを wpf でホストすることができました。(注: ホストされるアプリケーションは 2 つ以上あります)
ControlHost.cs 内
およびMainWindow.xaml.csで:
最後にMainWindow.xamlで:
まず、[開始] をクリックするよりも [アプリを取得] ボタンをクリックしてアプリを取得します。結果は次のようになります。
ただし、ユーザー入力を受け入れるホストされたアプリケーションは1 つだけです。(この例では、ユーザー入力を持つことができる赤丸で囲まれた最初のアプリケーションです) 他の 2 つはユーザー入力を受け入れません。他の 2 つのアプリケーションをクリックしても、何もトリガーされません。
私は多くの状況を扱っていないことを知っています。しかし、それは私が現在抱えている問題には影響しなかったと思います. これは私が書いた単純なアプリケーション (実際のアプリケーションではありません) であり、誰かが私と同じエラーを再現できることを願っています。
私が間違っていることはありますか?それとも私は何かを逃しましたか?どんな提案でも大歓迎です。前もって感謝します!
wpf - デスクトップ コンポジションが有効になっていると、HwndHost にコンテンツが表示されない
HwndHost を使用して、WPF ウィンドウに外部アプリケーションを埋め込みます。一部の Windows 7 マシンで、Aero テーマが選択され、デスクトップ コンポジションが有効になっている場合、外部アプリケーションが起動し、画面上で一瞬ちらつき、その後消えることに気付きました。デスクトップ コンポジションをオフにするか、基本テーマを使用すると、アプリケーションは WPF ウィンドウ内に正常に埋め込まれます。
これは、HwndHost から派生したクラスで使用するコードです。
問題が発生しても、Windows エラーは発生しません。プロセスは、それをクラスに挿入する別のウィンドウから開始されます。タスク マネージャーで確認しましたが、プロセスは実行されますが、WPF ウィンドウ内に表示されません。何かご意見は?
c# - HwndHost を使用して WPF アプリケーションに埋め込まれた Unity ウィンドウの更新を非同期化する
HnwdHost のおかげで、Win32 アプリケーション (Unity ウィンドウ) を埋め込む WPF アプリケーションに取り組んでいます。
パフォーマンス上の理由から、ユニティ ウィンドウのフレームレートを 30 FPS に設定する必要があります。ただし、WPF アプリケーションの他のユーザー コントロールがアニメーションを表示しようとすると、これらのアニメーションは流暢ではありません (たとえば、いくつかのボタンをすばやく強調表示しようとすると、強調表示がマウスのカーソルに追従するのに時間がかかります)。Unity ウィンドウのフレームレートを 500 に設定すると、もう問題ありません。
これが私がこの状況を分析する方法です。アニメーション中に、WPF GUI はすべてのコントロールを更新しようとしているようです。ただし、Unity ホスト (HnwdHost) のフレームレートが遅すぎるため、更新にかなりの時間がかかり、他のすべてのコントロールがそれを待っているようです。
では、WPF アプリケーションのレンダリングと Unity ウィンドウのレンダリングを非同期にする方法があるかどうか知っていますか (HwndHost のおかげで埋め込まれています)。
resize - Windows のコンポジション エンジン (DWM) の背景色アーティファクト
ケニー・カーのブログからのコンテキスト:
Windows Vista では、デスクトップ ウィンドウ マネージャーと呼ばれるサービスが導入されました。名前は誤解を招くものであり、現在も誤解を招き続けています。Windows の合成エンジンまたはコンポジターと考えてください。この合成エンジンは、デスクトップ上でのアプリケーション ウィンドウのレンダリング方法を完全に変えました。各ウィンドウをディスプレイまたはディスプレイ アダプターに直接レンダリングするのではなく、すべてのウィンドウをオフスクリーン サーフェスまたはバッファーにレンダリングします。システムはトップレベル ウィンドウごとにこのようなサーフェスを 1 つ割り当て、すべての GDI、Direct3D、そしてもちろん Direct2D グラフィックスがこれらのサーフェスにレンダリングされます。これらのオフスクリーン サーフェスは、リダイレクト サーフェスと呼ばれます。これは、GDI 描画コマンドと Direct3D スワップ チェーン プレゼンテーション リクエストでさえ、リダイレクト サーフェスに (GPU 内で) リダイレクトまたはコピーされるためです。
ある時点で、特定のウィンドウとは関係なく、構成エンジンは、最新の変更のバッチが与えられたデスクトップを構成する時期であると判断します。これには、これらすべてのリダイレクト サーフェスをまとめて構成し、非クライアント領域 (ウィンドウ クロームと呼ばれることが多い) を追加し、おそらくいくつかの影やその他の効果を追加し、最終結果をディスプレイ アダプターに提示することが含まれます。
以前のSOの質問の背景(写真を参照) :
DirectX でサイズを縮小すると、右端または下端に win32 背景のアーティファクトが表示されます。WS_EX_NOREDIRECTIONBITMAP
これは、スタイルを適用することで修正できます。スワップチェーンがウィンドウよりも小さいか大きいかは問題ではないためWS_EX_NOREDIRECTIONBITMAP
、コンポジション エンジンがないと、リダイレクション サーフェスに小さすぎる長方形がコピーされるように見えます (ウィンドウ サイズがマウス位置/「長方形のドラッグ」よりも遅れるため)。
実際の質問
ただし、WS_EX_NOREDIRECTIONBITMAP
最上位のウィンドウでのみ機能し、DirectX を子ウィンドウとして WPF に埋め込もうとしていますが、子ウィンドウの背景からのアーティファクトがまだ通過しています。これは、いくつかの関連する質問に私を導きます:
- (オプション) スワップチェーンがウィンドウ サイズよりも小さい場合、ウィンドウの残りの部分は黒で塗りつぶされます (写真を参照)。これは、スワップチェーンからリダイレクション サーフェスへのコピーの結果であり、宛先ストライドの残り (ソース幅の後) がゼロになりますか?
- (オプション) win32 バックグラウンドからのアーティファクトはどのように表示されますか? スワップチェーンからコピーする前に、リダイレクト サーフェスはこの色で塗りつぶされていますか?
- (オプション) ウィンドウのサイズが変更されるたびにリダイレクト サーフェスのサイズが変更されますか?
- (必須) 各子ウィンドウには、最上位ウィンドウのリダイレクト サーフェスにコピーされるリダイレクト サーフェスがありますか。そうでない場合、子供の win32 バックグラウンド アーティファクトはどのように表示されますか?
- (必須) これは、WPF に組み込まれた win32 ウィンドウのフレーム レートが WPF の可変フレーム レートに制限されるということですか? (DirectX ウィンドウを WPF に埋め込む目的は、一定の 60fps フレーム レートを取得することでした)