開発環境はVB6(SP6)、OSはXP(SP2)です。
UserControl上にWebBrowserコントロールを配置した
OCXを作っているのですがHWNDが正常に取れません。
0が返ってきてしまいます。
Microsoftの下記HP上でHWNDの仕方は調べたのですが
UserControlではなく、標準EXEでForm上に貼り付けたやり方なら
正常に取得できました。
UserControl上に配置したWebBrowserからはHWNDは取得できないのでしょうか?
実際に渡すコンテナのハンドルは、UserControl.hwnd を引数に渡してます。
よろしくお願いいたします。
すみません。
HPのアドレス書き忘れていました・・・
http://support.microsoft.com/kb/244310/ja
UserControl.hwndは存在しません。
Formのhwndを渡してください。
ご回答ありがとうございます。
Formのhwndを渡すということは、各ユーザコントロール毎の
hwndは取得できないってことですね・・。
どうもMicrosoftから提供されているHWNDの取得の仕方を見ると
フォーム上に複数のWebBrowserがあると最初の1個しかHWNDが
取得できないので、ユーザコントロールにしてみたのですが。
各WebBrowserのHWNDを取得することは無理ってことですかね?
それはウィングさんが参照しているコードが
最初のハンドルを見つけたらループを抜ける
構造になってるからでは。
ご回答ありがとうございます。
>それはウィングさんが参照しているコードが
>最初のハンドルを見つけたらループを抜ける
>構造になってるからでは。
ループを抜けないような構造にしたとしたときに、どのオブジェクトの
ハンドルなのかというのはどう判断したらいいですか?
同じクラスIDになるのでどれがどれに紐づくのかがわかりません。
どうやってもUserControl上では正しく取れないですね。
SPY++ツールを使って取れたハンドルとプログラム上での戻り値
を比較しても異なるんですよ。
>同じクラスIDになるのでどれがどれに紐づくのかがわかりません。
と言われても、それを区別するのがハンドルなんだけど・・・・
WebBrowserをいっぺんに起動せずに一つずつ起動するとか。
>どうやってもUserControl上では正しく取れないですね。
>SPY++ツールを使って取れたハンドルとプログラム上での戻り値
>を比較しても異なるんですよ。
と言われても、どこがいけないか判断するのに、再現出来る最低限のコードは必要かと。
とりあえず、タイプライブラリを作るなり探すなりして、
IOleWindowを使えるようにする、というのも手ですよ。
API関数で調べる場合は、Windowを列挙/調査するAPI関数で
どれが用途に合っているのかを調べてから使ってみるべき
でしょう。
Windowの親子・階層関係が固定か不定か。
該当するWindowは(特定の親Windowに対して)1つか複数か。
などの条件で、適切なものは変わってきますよね。
ちなみに、複数の場合でも、"ControlID"は異なるはずですし、
ControlIDとVB6のTabIndexの間には密接な関係があります。
ご回答ありがとうございます。
いろいろと試してみたのですが、
うまくいきませんでした・・。
実際何を作りたかったかといいますと、
ActiveXでWebBrowserを使ってUnicode対応のテキストボックスを
作成したかったのです。ToolTipTextをUnicodeで実装するために
ウィンドウハンドルがどうしても必要だったので・・。
うまくいかないので、VC++でUnicode対応のテキストボックス(OCX)を
作成することができましたので、この件は解決とさせていただきます。
いろいろと教えていただきましてありがとうございました。
ツイート | ![]() |