none
webbrowserコントロール内のテキストボックス操作 RRS feed

  • 質問

  • こんばんは。visual C++2005 .netFrameworkで開発しています。

    webbrowserコントロール内の読み込まれたテキストボックスに関連していくつか質問があります。

     

    webbrowserコントロールによって読み込まれたアクティブなテキストボックスを、

    プログラム側で用意したエディットボックスコントロール等のように、プログラムで自由に編集することは可能なのでしょうか。

    (キャレット位置を変えたり、キャレット位置に対応した文字の削除や追加等)

    用意した文字列を貼り付けるような動作については、過去に質問が出ているのですが。それ以上のことが可能であれば、

    そちらを用いたいと思い、質問させていただきました。

     

     

     

    もうひとつは、現在webbrowserコントロールにおいて現在アクティブであるdocumentが、入力可能なテキストボックスである

    ことを検出するには、どのようにコーディングすればよいのでしょうか。

    msdn libraryにてHtmlDocument.ActiveElement プロパティというものを発見したので、これを用いようと思うのですが、

     

    if(webBrowser1->Document->ActiveElement==A)

     

    という形で書く場合、Aに入るものがわからないのです。テキストボックスであることを表すには、なんと書けばよいでしょうか。

     

     

     

    以上2つの質問です。どなたか、どちらか一方でもヒントになることをご教授願えればと思います。

    どうぞよろしくお願いします。

    2008年1月22日 13:44

回答

  •  

    HTMLElementクラスではやれることは限られてくるようです

    HTMLElementはタグ要素の公約数のプロパティしか実装されていないように思います

     

    タグ固有のプロパティへのアクセスは DomElementをキャストして使うことになろうかと思います

     

    その際に『Microsoft HTML Object Library』を参照設定してここの中のクラスを使うことになりそうです

    Code Snippet

    たとえば テキストボックスなら

     mshtml::HTMLInputElement^ objInput = (mshtml::HTMLInputElement^)WebBrowser1->Document->ActiveElement;

    といった具合にオブジェクトを取得して objInputを使って処理することになると思います

     

    んー キャレットの移動とかって出来たかなぁ ・・・

    createTextRangeメソッドあたりを使うのかも

     

     

     

    2008年1月23日 15:57
  • 連続投稿ですいませんomotikunです。

    さきほどのコードを

     

    Code Snippet

    mshtml::HTMLInputTextElement ^objInput=(mshtml::HTMLInputTextElement ^)this->webBrowser1->Document->ActiveElement->DomElement;

    objInput->value="a";

     

     

    としたところうまくいきました。

    あとはobjInputにちゃんとポインタが読み込まれるかの例外処理で、アクティブなのがテキストボックスであるか

    は判定できそうなので、これでほぼ解決したかもしれません。

    また、何かあったら書き込みます。

    >redfoxさん

    本当にどうもありがとうございました。

    >中川さん

    分かりました。次からは回答済みに、チェックしますね。

    2008年2月18日 10:09

すべての返信

  •  

    HTMLElementクラスではやれることは限られてくるようです

    HTMLElementはタグ要素の公約数のプロパティしか実装されていないように思います

     

    タグ固有のプロパティへのアクセスは DomElementをキャストして使うことになろうかと思います

     

    その際に『Microsoft HTML Object Library』を参照設定してここの中のクラスを使うことになりそうです

    Code Snippet

    たとえば テキストボックスなら

     mshtml::HTMLInputElement^ objInput = (mshtml::HTMLInputElement^)WebBrowser1->Document->ActiveElement;

    といった具合にオブジェクトを取得して objInputを使って処理することになると思います

     

    んー キャレットの移動とかって出来たかなぁ ・・・

    createTextRangeメソッドあたりを使うのかも

     

     

     

    2008年1月23日 15:57
  • こんばんはomotikunです。

    返信ありがとうございます。mshtmlのクラスを用いた経験が無いので、勉強しながら

    redfox63さんのコードを用いてやってみようと思います。

     

    いろいろと試しても、どうしても分からない時は、また書き込むかもしれません。

     

    本当に、ありがとうございました。

    2008年1月24日 10:14
  • こんにちは。中川俊輔 です。

     

    redfox63さん、大変参考になる回答ありがとうございます。

     

    omotikunさん、フォーラムのご利用ありがとうございます。

    問題解決に有効な回答のようでしたので、redfox63さんの回答へ回答済みチェックをつけさせていただきました。

    追加の質問等ありましたら、ぜひ投稿してください!

     

    回答済みチェックが付くことにより、有用な情報を探している方が情報を見つけやすくなります。
    問題解決につながる回答があった場合は、なるべく回答済みボタンを押してチェックを付けてください。

    omotikunさんはチェックを解除することもできますので、ご確認ください。

     

    それでは!

     

    2008年2月4日 8:36
  • こんばんはomotikunです。

    すいません実は少し忙しく、最近やっとコーディングを再開したのですが、やはり分かりません。

    mshtml名前空間にHTMLInputElementというものは無く、とりあえず

     

    Code Snippet

    mshtml::HTMLInputTextElement ^objInput=(mshtml::HTMLInputTextElement ^)this->webBrowser1->Document->ActiveElement;

    objInput->value="a";

     

     

     

    としてみたのですが、yahoo等のテキストボックスがアクティブな場合でも

    「型 'System.Windows.Forms.HtmlElement' のオブジェクトを型 'mshtml.HTMLInputTextElement' にキャストできません。」
    という内容のエラーが起きて、どうやら一行目でつまずいているようなのです。

     

    これは

    this->webBrowser1->Document->ActiveElement;

    がそもそも変な値を返しているからなのでしょうか。

    キャスト方法、あるいは型が間違っているようなのですが分かりません・・・。

     

    現在webbrowserでアクティブなものが、テキストボックスである場合のみ、

    そこに文字列を書き込むようなプログラムを考えています。

    アクティブなのがテキストボックスであるという判定方法も、よかったら教えてほしいです。

     

    mshtmlのクラスに関するリファレンスのようなものが、ネット上で検索しても全く見つからないので自分で勉強するのが非常に難しいですね。

    良いホームページ、あるいはヒントでもいいので良かったら返信してください。

    よろしくお願いします。

    2008年2月18日 8:51
  • 連続投稿ですいませんomotikunです。

    さきほどのコードを

     

    Code Snippet

    mshtml::HTMLInputTextElement ^objInput=(mshtml::HTMLInputTextElement ^)this->webBrowser1->Document->ActiveElement->DomElement;

    objInput->value="a";

     

     

    としたところうまくいきました。

    あとはobjInputにちゃんとポインタが読み込まれるかの例外処理で、アクティブなのがテキストボックスであるか

    は判定できそうなので、これでほぼ解決したかもしれません。

    また、何かあったら書き込みます。

    >redfoxさん

    本当にどうもありがとうございました。

    >中川さん

    分かりました。次からは回答済みに、チェックしますね。

    2008年2月18日 10:09