C# と VB.NET の質問掲示板

ASP.NET、C++/CLI、Java 何でもどうぞ

C# と VB.NET の入門サイト

Re[2]: IDisplayServicesへのキャスト方法


(過去ログ 81 を表示中)

[トピック内 5 記事 (1 - 5 表示)]  << 0 >>

■47882 / inTopicNo.1)  IDisplayServicesへのキャスト方法
  
□投稿者/ jyo (1回)-(2010/03/17(Wed) 04:34:31)

分類:[C#] 

[開発環境:VisualStudio2008 standard .NET framework3.5]

はじめまして。
IHTMLDocument2インタフェースをIDisplayServicesにキャストする方法について質問させてください。

すでに起動しているIEをハンドリングして、とあるhtmlエレメントの座標を取得しようとしています。
IEがフレーム構成の場合に座標の補正を行うため、IDisplayServicesインタフェースのTransformPointメソッドを利用しようとしています。
IDisplayServicesはIHTMLDocument2からキャストが出来るようなのですが、InvalidCastExceptionで失敗してしまいます。
http://msdn.microsoft.com/en-us/library/aa752659(VS.85).aspx)

○失敗するコード
  ShellWindows sw = new ShellWindows();
  SHDocVw.WebBrowser _ie;

  //_ieにShellWindowsから取得したIEを代入(中略)

  IHTMLDocument2 ihd2 = _ie.Document as IHTMLDocument2;
  IDisplayServices ids = ihd2 as IDisplayServices;

一方、System.Windows.Forms.WebBrowserから取得できるDocumentオブジェクトは、キャストが成功します。
○成功するコード
  WebBrowser webBrowser1 = new WebBrowser();
  webBrowser1.Navigate("URL");
  IHTMLElement elm = webBrowser1.Document.GetElementById("適当なid").DomElement as IHTMLElement;
  IHTMLDocument2 doc2 = elm.document as IHTMLDocument2;
  IDisplayServices ids2 = doc2 as IDisplayServices;

質問内容ですが、
 System.Windows.Forms.WebBrowserからならキャスト可能、SHDocVw.WebBrowserからはキャスト不可のように思えますが、コードにおかしな個所は無いでしょうか?
 プログラム中でIEを起動するのではなく、すでに起動しているIEのエレメントからIDisplayServicesへ持っていく方法はあるでしょうか?
 そもそもブラウザがフレーム構成の場合のエレメントの座標の取得方法が別にあるようでしたら、教えていただけますか?

---
似たような話題はいくつか見つけましたが、どれも解決していないようでした。
・起動済のIEから.NET FrameworkのHtmlDocument → ムリ
 http://okwave.jp/qa/q3873841.html
・WebClient で得た HTML を HtmlDocument で解析したいが WebBrowser がないと使えない?
 http://www.atmarkit.co.jp/bbs/phpBB/viewtopic.php?topic=45032&forum=7
・cross-process martharingはムリ?
 http://social.msdn.microsoft.com/Forums/en/ieextensiondevelopment/thread/2d158f90-df91-444b-a697-9325bad6ec36
・同じような問題(未解決)
 http://www.itwriting.com/phorum/read.php?3,1775,3398,quote=1

引用返信 編集キー/
■47883 / inTopicNo.2)  Re[1]: IDisplayServicesへのキャスト方法
□投稿者/ Jitta on the way (584回)-(2010/03/17(Wed) 06:57:06)
No47882 (jyo さん) に返信

リンク先等は見ていません。
そもそも、IDisplayServices と IHTMLDocument2 に、互換性が有るのでしょうか?何でもかんでも、投げつければ(cast)変型するわけではありません。元のオブジェクトに互換性がある場合に変換できます。互換性があるかどうかは、型の仕様を見れば載っています。互換性があること(この場合、SHDocVw.WebBrowser と IDisplayServices との間に)は、確認済みなのでしょうか。
引用返信 編集キー/
■47910 / inTopicNo.3)  Re[2]: IDisplayServicesへのキャスト方法
□投稿者/ jyo (3回)-(2010/03/17(Wed) 18:35:56)
No47883 (Jitta on the way さん) に返信
> ■No47882 (jyo さん) に返信
>
> リンク先等は見ていません。
> そもそも、IDisplayServices と IHTMLDocument2 に、互換性が有るのでしょうか?何でもかんでも、投げつければ(cast)変型するわけではありません。元のオブジェクトに互換性がある場合に変換できます。互換性があるかどうかは、型の仕様を見れば載っています。互換性があること(この場合、SHDocVw.WebBrowser と IDisplayServices との間に)は、確認済みなのでしょうか。

返信ありがとうございます。
MSDNでは、IDisplayServiceへのポインタを取得するにはIHTMLDocument2インタフェースへのポインタに対してCOMのQueryInterfaceを行うこと、と書かれています。
C#ではこれをキャストで実現していますが、うまく行く場合とうまく行かない場合があるということです。
(なので2つのインタフェース自体に互換性はないと思います。)

IHTMLDocument2ならば常にIDisplayServicesへのキャストはできる・・・というわけではないんでしょうね。。

引用返信 編集キー/
■47915 / inTopicNo.4)  Re[1]: IDisplayServicesへのキャスト方法
□投稿者/ 魔界の仮面弁士 (1565回)-(2010/03/17(Wed) 19:32:19)
No47882 (jyo さん) に返信
> そもそもブラウザがフレーム構成の場合のエレメントの座標の取得方法が別にあるようでしたら、

試してはいないので、できるかどうかは分かりませんが
  http://msdn.microsoft.com/en-us/library/dd318472.aspx
または
  http://msdn.microsoft.com/ja-jp/library/accessibility.iaccessible.acclocation.aspx
が使えないでしょうか。

# MSHTML は、Active Accessibility のサポートがあったはず…。
# http://msdn.microsoft.com/ja-jp/library/ms528415.aspx
引用返信 編集キー/
■48011 / inTopicNo.5)  Re[2]: IDisplayServicesへのキャスト方法
□投稿者/ jyo (4回)-(2010/03/19(Fri) 20:48:29)
No47915 (魔界の仮面弁士 さん) に返信
> ■No47882 (jyo さん) に返信
>>そもそもブラウザがフレーム構成の場合のエレメントの座標の取得方法が別にあるようでしたら、
>
> 試してはいないので、できるかどうかは分かりませんが
>   http://msdn.microsoft.com/en-us/library/dd318472.aspx
> または
>   http://msdn.microsoft.com/ja-jp/library/accessibility.iaccessible.acclocation.aspx
> が使えないでしょうか。
>
> # MSHTML は、Active Accessibility のサポートがあったはず…。
> # http://msdn.microsoft.com/ja-jp/library/ms528415.aspx

ありがとうございます。とりあえず、
>   http://msdn.microsoft.com/en-us/library/dd318472.aspx
を参考にしてクリックしたボタンの座標を取得することが出来ました。
次はhtmlの構造をたどってIAccessibleインタフェースを取得できるか試してみます。

引用返信 編集キー/


トピック内ページ移動 / << 0 >>

このトピックに書きこむ

過去ログには書き込み不可

管理者用

- Child Tree -