トップ回答者
WPF ユーザーコントロールを VB6 アプリでホストする方法について

質問
-
WPFのユーザーコントロールを VB6 アプリにホストする方法を調査しています。
Windows Forms のユーザーコントロールに ElementHost を乗せて COMコンポーネントにすればよいと考えていましたが、実装して動作確認すると、ホストアプリであるVB6側のコントロールにフォーカスが移った後でCOMコンポーネント上のコントロールをクリックしても反応しないという問題が生じています(正確には、COMコンポーネントをダブルクリックすると反応しだしますが、VB6のコントロールにフォーカスしてしまえば同じ状態に戻ります)。
COMコンポーネント化した Windows Forms ユーザーコントロールは、実装上の工夫はしていないのですが、あまり適切な回避方法が思い当たりません。ホストアプリ側が VB6 というのがなんともならんですが、何かご存知の方がいらっしゃいましたらアドバイスを頂けると助かります。
※ ATL + C++/CLI で COMを作成して、 HwndSource を乗せるという方法も試みているのですが、こちらはWPFユーザーコントロールライブラリをロードするときに、アセンブリバインディングでエラーが発生してしまい苦戦中・・・何がマズいのかよくわからない。
回答
-
以下の手順でテストしましたが再現しないですね。
- C# ActiveX control (CSActiveX)からサンプルをダウンロード。
- WPFユーザーコントロールにTextBoxとButtonを配置して、ButtonのClickイベントを適当に記述。
- WPFユーザーコントロールをElementHostでサンプルのFormsユーザーコントロールに追加。
- ビルドして登録。
- VB6でプロジェクトを作成。
- 上記で作ったdllをVB6で参照。
- 上記コントロールとVB6テキストボックスを配置。
- exeにビルド。
- Win8.1,Win10で実行してみる。
マウスカーソルがButtonに乗ると普通に色が変わりますし、クリックは1回で反応します。
TextBoxもタブ1回でフォーカス移動します。#何かのコントロールがフォーカスの取り合いをしてたり?
個別に明示されていない限りgekkaがフォーラムに投稿したコードにはフォーラム使用条件に基づき「MICROSOFT LIMITED PUBLIC LICENSE」が適用されます。(かなり自由に使ってOK!)
- 回答としてマーク miromok 2018年1月16日 13:54
すべての返信
-
以下の手順でテストしましたが再現しないですね。
- C# ActiveX control (CSActiveX)からサンプルをダウンロード。
- WPFユーザーコントロールにTextBoxとButtonを配置して、ButtonのClickイベントを適当に記述。
- WPFユーザーコントロールをElementHostでサンプルのFormsユーザーコントロールに追加。
- ビルドして登録。
- VB6でプロジェクトを作成。
- 上記で作ったdllをVB6で参照。
- 上記コントロールとVB6テキストボックスを配置。
- exeにビルド。
- Win8.1,Win10で実行してみる。
マウスカーソルがButtonに乗ると普通に色が変わりますし、クリックは1回で反応します。
TextBoxもタブ1回でフォーカス移動します。#何かのコントロールがフォーカスの取り合いをしてたり?
個別に明示されていない限りgekkaがフォーラムに投稿したコードにはフォーラム使用条件に基づき「MICROSOFT LIMITED PUBLIC LICENSE」が適用されます。(かなり自由に使ってOK!)
- 回答としてマーク miromok 2018年1月16日 13:54
-
以下の手順でテストしましたが再現しないですね。
- C# ActiveX control (CSActiveX)からサンプルをダウンロード。
- WPFユーザーコントロールにTextBoxとButtonを配置して、ButtonのClickイベントを適当に記述。
- WPFユーザーコントロールをElementHostでサンプルのFormsユーザーコントロールに追加。
- ビルドして登録。
- VB6でプロジェクトを作成。
- 上記で作ったdllをVB6で参照。
- 上記コントロールとVB6テキストボックスを配置。
- exeにビルド。
- Win8.1,Win10で実行してみる。
マウスカーソルがButtonに乗ると普通に色が変わりますし、クリックは1回で反応します。
TextBoxもタブ1回でフォーカス移動します。#何かのコントロールがフォーカスの取り合いをしてたり?
返信・再現確認ありがとうございます。
私の方でも提示していただいたサンプルで試したところ、確かに上手く動作しました。
サンプルと自分のソースを比較したりの、実装を削除したりして不具合の境界を探っていったところ、レジストリ登録が原因でした。単にComVisibleなクラスに属性付けるだけでは、良きように動いてくれないんですね。
HKCR\CLSID\{guid}\MiscStatus キーの値に OLEMISC_ACTIVATEWHENVISIBLE フラグを無くしたらサンプルでも同様の現象が見られました。
サンプルを参考にレジストリの登録周りの処理を追加して、問題なく動作することを確認できました。
ありがとうございました。