問題タブ [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.
wpf - HwndHost から基になる WPF コントロールに入力イベントを渡しますか?
HwndHost で発生する入力イベント (主にマウス、最終的にはキーボード入力も) を基になる WPF コントロール (パネルなど) に渡す方法はありますか? HwndHost 内で WndProc に接続して、Windows メッセージを受け取ることができます。マウス クリックの routedevent を手動で作成し、それを親に送信してバブルアップさせることはできますか? アイデアをいただければ幸いです。ありがとうjkersch
.net - HwndHostの初期化を強制する
私のWPFアプリケーションでは、HwndHostを使用してWin32コンテンツをホストしています。ただし、HwndHostを作成しても、ネイティブウィンドウは作成されません。BuildWindowCore()
むしろ、これは、後でWPFによって呼び出されるオーバーライドされたメソッドで実行されます。
ホストされているコンテンツは、独自の初期化のためにネイティブウィンドウのウィンドウハンドルを必要とします。残念ながら、ウィンドウの作成を強制する方法はありません(つまり、WPFでBuildWindowCoreを呼び出す)ので、初期化されるまでHwndHostをポーリングする2番目のスレッドがあります。
.NET 4.0 / WPF 4.0では、新しいメソッドWindowInteropHelper.EnsureHandle()
が追加されました。これで状況が解決することを期待していましたが、HwndHost(Windowから派生していない)ではなく、Windowでのみ機能します。代わりに私に何ができるか提案がありますか?
編集:
考えられる解決策のために、さらにいくつかの制約を追加するのを忘れました。
- HwndHostは、ユーザー設定に応じて、アプリケーションのメインウィンドウの子になることも、(サードパーティのドッキングマネージャーを介して)新しいウィンドウに配置することもできるコントロールに配置されます。これは、ウィンドウの作成中に、親ウィンドウ(したがってそのhWnd)がどうなるかわからないことを意味します。
- ネイティブコードは初期化中にhWndを必要としますが、ウィンドウはユーザーが表示を要求した場合にのみ表示されます(つまり、最初は表示されません)。可能であれば、ウィンドウを表示する必要はありませんが、すぐに非表示にするだけです。
wpf - HwndHost 派生クラスの BuildWindowCore メンバーを強制的に呼び出す
HwndHost から派生したクラスを使用して、Win32 ウィンドウをホストします。これは、ユーザー コントロール内で使用されます。内部 Win32 ウィンドウが正常に作成されない限り、そのユーザー コントロールは表示されません (可視性)。ただし、BuildWindowCore メソッドは、HwndHost ウィンドウが表示されていない限り呼び出されないように見えるため、ニワトリと卵の状況になります。
HwndHost 派生クラスが表示されない場合、その BuildWindowCore メソッドを呼び出す別の方法はありますか?
c# - WPF ウィンドウでの外部アプリのホスティング
ユーザーが移動/サイズ変更/などできるビューポートを持つWPFでレイアウトマネージャーを開発しています。通常、ビューポートには、レイアウト マネージャーで制御されているプロバイダーを介してデータ (写真/動画など) が入力されます。私の仕事は、ビューポートで外部 Windows アプリ (つまり、メモ帳、電卓、Adobe Reader など) をホストすることも可能かどうかを調べることです。私は多くの問題に遭遇します。
ほとんどのリソースは、HwndHost クラスの使用を指しています。私はマイクロソフト自身からこのチュートリアルを試しています: http://msdn.microsoft.com/en-us/library/ms752055.aspx
リスト ボックスが外部アプリケーションからの Windows ハンドルに置き換えられるように、これを調整しました。誰でもこれらの質問で私を助けることができます:
- このチュートリアルでは、 が配置される追加の静的サブ ウィンドウを追加します
ListBox
。外部アプリには必要ないと思います。省略すると、外部アプリを子ウィンドウにする必要があります (user32.dll から Get/SetWindowLong を使用して as に設定GWL_STYLE
しますWS_CHILD
)。しかし、それを行うと、アプリのメニュー バーが (WS_CHILD
スタイルのために) 消えてしまい、入力を受け取ることができなくなります。 - サブウィンドウを使用し、外部アプリをその子にすると、合理的に機能しますが、外部アプリが正常に描画されない場合があります。
- また、ビューポートに合わせて子ウィンドウのサイズを変更する必要があります。これは可能ですか?
- 外部アプリが子ウィンドウを生成する場合 (つまり、メモ帳 -> ヘルプ -> バージョン情報)、このウィンドウは によってホストされません
HwndHost
(したがって、ビューポートの外に移動できます)。それを防ぐ方法はありますか? - 外部アプリケーションとレイアウト マネージャーの間でそれ以上の対話は必要ないので、メッセージをキャッチして転送する必要がないと想定してよいでしょうか? (チュートリアルでは、HwndSourceHook をサブ ウィンドウに追加して、リスト ボックスでの選択の変更をキャッチします)。
- (変更されていない) サンプル VS2010 を実行してウィンドウを閉じると、VS2010 はプログラムが終了したことを認識しません。すべてを壊すと、ソースなしでアセンブリになってしまいます。何か異臭がするのですが、見つかりません。
- ウォークスルー自体は非常にずさんなコーディングのようですが、この件に関するより良いドキュメントは見つかりませんでした。他の例はありますか?
- もう 1 つのアプローチは、使用しないことです
HwndHost
が、ここでWindowsFormHost
説明したとおりです。動作します (そして、はるかに簡単です!) が、アプリケーションのサイズを制御できませんか? また、WinFormHost は実際にはこのためのものではありませんか?
正しい方向への指針をありがとう。
wpf - 「{DependencyProperty.UnsetValue}」はプロパティ「FocusVisualStyle」の有効な値ではありません
運が悪いのでデバッグしようとしている奇妙なエラーがあります。
一部のコンテンツを表示する hwndhost をサブクラス化しました。そのクラスには、フルスクリーンに設定する次の関数があります。
これはプロトタイプの WPF アプリでは問題なく動作しましたが、メイン アプリでこのコードを使用すると、ウィンドウを閉じるとき (エスケープ キー) とfs.close()
呼び出し時に次のエラーが発生します。
'{DependencyProperty.UnsetValue}' is not a valid value for property 'FocusVisualStyle'.
奇妙なことに、ウィンドウが閉じてから約 1500ms 後に発生します。FocusVisualStylefs
を null に設定しようとしましたが、別のように見えます。直観的には、このプロパティを持たないアプリ内の別の要素に焦点を合わせようとしているのですが、実際にはわかりません!
ありがとう!
編集。問題は、フルスクリーン ボタンの FocusVisualStyle のカスタム設定でした。{x:Null} に設定すると、問題はなくなりました。
wpf - WPF相互運用機能-HwndHostがホストされているウィンドウを自動的に破棄しない
ホストされているウィンドウが正しく破棄されていることを確認するのに問題があります。
HwndHost
TabControlに表示している派生クラスがあります(おそらくそれは無関係ですが)。タブが閉じたときに(含まれているウィンドウが閉じたときではなく)、ホストされているコンテンツを破棄しようとしています。
私は現在、の効果のコードを持っています。myControlHost.Dispose()
これにより、HwndHost.DestroyWindowCore
すぐに呼び出されます。問題は、DestroyWindowCoreがホストされているHWNDコンテンツを実際に破棄しないことです。
CWnd
基盤となる派生アプリケーションが何かを確実に受信するにはこれで十分だと思いましたがWM_CLOSE
、これは発生しないようです。Spy++は、送信された登録済みメッセージ「HwndSubclass.DetachMessage」のみを報告します。
WM_CLOSE
これは自動的に行われることになっているため、ホストされているウィンドウを明示的に送信することは想定されていないことを読みましたDestroyWindowCore
。
HwndHost
派生コントロールを手動で削除するときに、ホストされているウィンドウが正しく破棄されるようにする正しい方法は何ですか?
wpf - HwndHost の親であるリッチ エディット コントロールに入力すると、WPF ショートカットがアクティブになります
従来の MFC リッチテキスト エディターをラップする WPF アプリを作成しています。リッチテキスト エディターを HwndHost にラップしました。HwndHost コントロールは、WPF TabControl と並んで配置されます。
http://www.kempy.co.uk/code/Test.pngで実行中のアプリのスクリーンショット
フォーカスの問題とナビゲーションの問題 (上/下/左/右/タブ/入力) は別として、私は解決できましたが、まだ 1 つのショーストップの問題があります。
パネル上のショートカット キーであるリッチ テキスト コントロールに文字が入力されると、ショートカットがアクティブになり、リッチエディット コントロールはその文字を取得しません。http://www.kempy.co.uk/code/Test.zipには、動作を実証するための簡単なテスト プロジェクトが添付されています。リッチ エディット コントロールで P または C を押すと、リッチ テキスト コントロールにキーボード フォーカスがあっても、パネルにフォーカスするか、ボタンをクリックします。
参考までに、リッチ エディット コントロールが Tab、Enter、Up、Down、Left、Right を処理できるようにするコードを次に示します。
c# - 文字列を dll に渡す
文字列パラメータを使用してC#WPFアプリケーションからc++ dllで関数を呼び出す方法は? 「[DLLImport]」ではなく「Add References」を介してC#アプリにdllを追加します
すべての問題は、C# が 'char*' ではなく 'sbyte*' パラメータを持つ関数を提案することです。「int」パラメーターを持つ関数は完璧に機能します。
コードは次のとおりです。
C ++ dllの私の関数:
C# コード:
myFunc は、'char*' ではなく、'sbyte*' パラメータを必要としています。なんで?
または、文字列を sbyte に変換する方法を教えてください*
wpf - ウィンドウに HwndHost 要素が含まれている場合、サイズ変更時にカスタム dwm 描画ウィンドウ フレームがちらつく
私はこれについて数日間考えてきましたが、これを理解するためにウィンドウとwpfが内部でどのように機能するかについての基本的な理解が不足していると思います。
問題はこれです:
aero タイトル バー (office など) に wpf コントロールを描画できるウィンドウを作成しました。ウィンドウに Hwndhost 要素を追加しない限り、これは正常に機能します。この場合、フレームのサイズを変更すると、HwndHost がかなりひどくちらつき始めます (他の要素は適切にレンダリングされるようです)。また、 WPF Shell Integration ライブラリのカスタム フレーム ウィンドウの実装を使用してみましたが、結果は同じなので、完全に私のせいではないと考えています。
次のコードは、問題を再現する簡単なコンパイル可能なプログラムです。サンプルは C# にありますが、答えは必ずしもそうである必要はありません。
wpf - Win32 SetCursor()をWPFリソースおよびHwndHostで使用する方法
Direct3dグラフィックを表示するために使用されるWPFアプリケーションにHwndHostUIElementがあり、HwndHost UIElmentのカーソルを設定する唯一の方法は、Win32 API SetCursor()を呼び出すことです。すべてのカーソルはマネージドアセンブリのリソースであり、変更したくないのですが、LoadImage()などのWin32APIを介してこれらのカーソルの1つをロードする方法を見つけることができませんでした。
管理対象アセンブリのリソースであるカーソルへのhandle(hCursor)を取得する方法を知っている人はいますか?
または、Direct3Dグラフィックを表示するHwndHostにカーソルを設定する別の方法はありますか?