C++で既に開かれているIEを操作する方法

このQ&Aのポイント
  • C++でSystem.Windows.Forms.WebBrowserを使って既に開かれているIEを操作する方法について説明します。
  • IEのウィンドウを羅列する方法と各タブで任意のページを取得する方法を解説します。
  • システムのメンテナンス性を考慮して、System.Windows.FormsのHTML操作系のクラスを用いて操作を行います。
回答を見る
  • ベストアンサー

【続・IEを操作したい】

C++で、 System.Windows.Forms.WebBrowser を使って、 既に開かれているIEを操作したいです。 Shdocvw.dll を間接的に使うのはアリで、 Shdocvw.dll を直接は使わずに行いたいです。 (.NETのラッパーを使っても良いですし、COMインタフェースを使っても良いです。 実質、やっていることは同じなのにナゼ?と感じると思うのですが、色々事情があるのです。) 調べて、結構分かってきているつもりなのですが、(2)の部分で困っています。 (1)IEのウィンドウを羅列する。  IShellWindows::FindWindowSW  で取っています。 (2)そのIEの各タブで、任意のページ(例えばhttps://www.google.co.jp)があったら、それをIEオブジェクトに代入。 (備考:試したこと) IDispatch* の  QueryInterface を使って、 IWebBrowser2* IHTMLDocument2* などと、段々掘り下げていって、HTMLElementを操作しようとしていたのですが、、 (要件) システムのメンテナンス性というか、  誰でもプログラムを修正できるようにするために、  System.Windows.Forms の配下のHTML操作系のクラスで取り扱いたいのです。  何卒宜しくお願いします。 ***********************************************************  これは想像ですが、  Shell.Applicationのインスタンスを作っておいて、  現在のウィンドウのリストから、Windows のアイテムを取って、  そのアイテム(ウィンドウ?)の名前?クラス?を取って、  path == "iexplore.exe" で実行されているものであるなら、  IEオブジェクトに代入というようなことができたりするのかなぁ、、  と捉えています。

質問者が選んだベストアンサー

  • ベストアンサー
  • kumatti1
  • ベストアンサー率60% (73/121)
回答No.2

サンプル書きました。 「IHTMLDocument2からのSystem::Windows::Forms::HtmlDocument変換」 https://gist.github.com/kumatti1/36422d319017d2ad10a7

paranoia23
質問者

お礼

ありがとうございます! Shdocvw.dll のインポートの部分は行わずに、 comapi のincludeに抑えて、.NET のクラスに詰め替えようと思います! このサンプル、 マネージコードと、ネイティブコードの混在の例としても良さそうですね!

その他の回答 (1)

noname#212058
noname#212058
回答No.1

.NETのラッパがOKなら、プロジェクトに「マネージドDLL」 として Microsoft Internet Controls (Shdocvw.dll) の参照を 追加した場合、Visual Studio .NET は 自動的に .NET の ラッパ Interop.SHDocVw.1.1.dll を作ります。プログラムコードから はラッパを介したアクセスになりますが、これは OKなのでしょ うか? (正直、IEを操作するならこの方法がいちばん簡単だと 思うのですが) IHTMLDocument2 のオブジェクト(DOM)を HtmlDocument クラス経由で操作するのは、厳しいと思いますけどね。HTML の解析目的で HtmlDocument に『変換』したことはあります が、その場合は変換先は元の IE のオブジェクトとは別のイン スタンスになるので、今回の目的には沿わないでしょうし。

paranoia23
質問者

お礼

ありがとうございます。 大きなヒントになりました。

paranoia23
質問者

補足

ありがとうございます。 Shdocvwのラッパーが使えるということで、こう光明が見えてきました。 ただ、自分の力不足で、 IShellWindows::FindWindowSW ののちに、 Shdocvwのラッパーに代入する方法がわからず困っています。 お力添えを頂くことはできませんでしょうか?? (×_×) IDispachポインタからIWebBrowser2ptr を取ったあと、 それをSYSTEM::Windows::Forms::Webbrowser に代入するのも、 IDispachポインタからIHtmlDocument2Ptr まで落としてから それをSYSTEM::Windows::Forms::HtmlDocument に代入するのも、 やり方として間違っているっぽいというのは挙動から推測できるのですが。。

関連するQ&A

  • 起動済のIEから.NET FrameworkのHtmlDocumentを取得できますか?

    【環境・言語】Windows XP + IE6 + Visual Basic 2008 既に起動しているInternet ExplorerのオブジェクトをShellWindowsから探して、SHDocVw.InternetExplorer型の変数(objIE)に代入してあります。   Dim objIE As SHDocVw.InternetExplorer   'ShellWindowsから目的のIEオブジェクトを探してobjIEに代入 ここから、mshtml.HTMLDocumentを取得するところまでは分かります。   Dim objDoc As mshtml.HTMLDocument = CType(objIE.Document, mshtml.HTMLDocument) これではなくて、.NET FrameworkのHtmlDocumentクラス(System.Windows.Forms名前空間)のオブジェクトを取得することはできるでしょうか? ↓のように無理やりやってみたら、   Dim objDoc2 As System.Windows.Forms.HtmlDocument = CType(objIE.Document, System.Windows.Forms.HtmlDocument) ↓のようなエラーが出ました。   System.InvalidCastException はハンドルされませんでした。   Message="型 'mshtml.HTMLDocumentClass' の COM オブジェクトをクラス型 'System.Windows.Forms.HtmlDocument' にキャストできません。COM コンポーネントを表す型のインターフェイスを COM コンポーネントを表さない型にキャストすることはできません。ただし、基になる COM コンポーネントがインターフェイスの IID の QueryInterface 呼び出しをサポートする場合は、インターフェイスにキャストすることができます。" mshtml.HTMLDocumentを使ってHTMLを解析していくと、COMオブジェクトの解放が大変そうなので、できれば.NET Frameworkの中で操作したいと思っています。逆(.NET Framework→COM)はHtmlDocument.DomDocumentで簡単に出来るようですが、COMから.NET Frameworkへの変換は出来ないんでしょうか?

  • InternetExplolerで開いているページ

    C++で、 (1)IEのプロセスを全て取得する。 (2)そのIEの各タブで、「任意のドメインの含むページ(例えばhttps://www.google.co.jp)」を開いているかをチェックする ということを、「ActiveXを使わずに」行いたいです。 System.Diagnostics に属するProcessクラスで、 Process.GetProcessesByName でプロセスの配列を掴むことはできるようなのですが、 このプロセスを、「GetURL」のようなインタフェースを持ったクラスのインスタンスとして、 代入して、表示しているページのアドレスを取得したいのです。 ブラウザの操作を行うには、 System.Windows.Forms.WebBrowser というクラスを使うのが良さそうだというのまでは調べてわかったのですが、 Process のインスタンスを、WebBrowser のインスタンスに代入するには、 どうすればよいのでしょうか?

  • .NETとActiveXの関係

    c++からブラウザ操作を行うプログラムを作成しています。 その際、.NET版 と ActiveX版を作りましょうという話になったのですが、 .NET と ActiveX の関係がわからず、教えて頂きたいです。 ActiveXは、 ネット関連のコンポーネントや技術と捉えています。 例えば、 WebBrowser コントロール (SHDocVw.dll)も ActiveXに属するという認識です。 対して、.NETは、 端的に言えばマイクロソフトが開発したアプリケーション開発、実行環境とのことですが、 WebBrowser コントロール (SHDocVw.dll)と同じことをしようと思ったら、 System.Windows.Forms.WebBrowser を使ったり、 SHDocVw.dll をimport することになるとおもいます (後者は工夫が必要そうですが) なので、 .NET は、ActiveXを包含しているという風に認識していたのです。 ActiveX コントロールは、.NETのControlクラスを継承しているはずがないので、 Windowsのポインタ(EnvDTE::Windows)ではなく IEオブジェクト用のポインタ( IShellWindowsPtr、 IWebBrowser2Ptr)を使う必要があるものの、 この認識だと、 「.NET版 を作成したら ActiveX版を作っているのと同じ」となので 冒頭の「.NET版 と ActiveX版を作りましょう」と矛盾し、 .NET が ActiveX を包含しているというわけではない?? .NET と ActiveX の関係ってどういう関係?? となり、正しい認識を教えて頂きたいのです。 .

  • IE7のVB.NETでの操作

    Dim IE as Object Dim f As Object IE = CreateObject("InternetExplorer.Application") f = IE.document.forms(0) f.sentaku.click() このようにしてIEのボタンを押そうと考えているのですが、f = IE.document.forms(0)のところでエラーがでて止まってしまいます。 IE7はこのような操作はできなくなってしまったのでしょうか。 IEを終了して開き直して試しても同じ結果で困っています。 解決策を教えてください。 よろしくお願いします。

  • 起動済みのIEをハンドルから操作するには

    既に起動済みのIEブラウザをWSH(VBS)などから、ハンドルを取得して HTMLソース内のフォームに値をセット(Document forms elementなどで) する事はできますでしょうか? 出来るとすれば、IEを捕まえて操作するには、どのようにすれば良い でしょうか? ■補足 起動したIEは、自身のスクリプトからオブジェクトを生成したもの では無く、ウインドウタイトルくらいしか解りません。

  • IEで複数のウィンドウが開けません

    フォルダのウィンドウは複数開くのですが、IEでは1つのウィンドウしか開けなくなってしまいました。原因かどうか分かりませんが、現象が出る前にSP2を削除しました。対応策と思われる操作を試しましたが改善されません(1.ファイル名を指定して実行→regsvr32 urlmon.dll →OK 2.1の操作で regsvr32 actxprxy.dll とregsvr32 shdocvw.dll を実行)。改善策をご存知でしたら是非教えてください。

  • VBSでIE操作

    VBSでIEの操作を自動化するプログラムを作成しています。 ドロップダウンリストを選択する処理で、サイト側のソースが「name="birthday[Y]"」や「name="birthday[m]"」、「name="birthday[d]"」だった場合、単純な指定では動作しないのでしょうか? VBS上では「IEオブジェクト.Document.forms(0).("birthday[Y]").value = "1983"」という記述で試してみたところ、「オブジェクトがありません。:'Y'」とエラーになってしまいます。 birthday[?]は配列的なもので特別な指定の仕方があるのでしょうか? プログラムを組み始めて間もないため記述に不足等あるかと思いますが、アドバイスいただけると幸いです。

  • VBAで起動しているIEの操作

    IEでOKWAVEを開いていたら イミディエイトウィンドウに タイトルを表示するのに 次の 記述をしましたが エラーになりました。 実行時エラー '-2147467259 (80004005)': 'Document' メソッドは失敗しました: 'IWebBrowser2' オブジェクト なぜでしょうか? IEは11です。 エクセルは2013 OSは windows7 ホームプレミアム vbsは次の通り Sub okwave() Dim colSh As Object Dim win As Object Dim strTemp As String Dim objIE As Object Set colSh = CreateObject("Shell.Application") For Each win In colSh.Windows If TypeName(win.document) = "HTMLDocument" Then If InStr(win.document.Title, "okwave") > 0 Then Set objIE = win Exit For End If End If Next Debug.Print objIE.document.Title End Sub

  • WebBrowserで特定の要素を削除

    Form内で表示されているWebBrowserで特定の要素たとえば<img>とか<script>とかを削除(排除)させて表示したいです。 VBを使い初めてまだ間もないです。 一応今使ってるのはVB2008ですが2005系の回答でも結構です^^ またYahoo!知恵袋のほうでも同じ質問が出ていたようですが解決はしていないようです。 http://detail.chiebukuro.yahoo.co.jp/qa/question_detail/q1019157800 試してみたもの Dim instance As HtmlElement Dim name As String instance.RemoveAttribute(name) これをDocument_Completedイベントの中に記述しました。以下エラー 'RemoveAttribute' は 'System.Windows.Forms.HtmlElement' のメンバではありません。 また、それに似たのもMSDNにありますが、駄目でした。 http://msdn.microsoft.com/ja-jp/library/system.windows.browser.htmlelement.removeattribute%28VS.95%29.aspx

  • IEでフレーム内が表示しない

    win98、IE6SP1で、リンク先など新しいウィンドウを開こうとするとブラウザの枠のみが表示されてページを表示せずにハングアップします。特定のページではないのでただ単にアクセスが集中して重いだけでは無い様なのですがなぜでしょう?ちなみに以下の処置は実施済みですが状況は変わりません。 ・IE6の修復 ・IE6→IE5.5化 ・IE5.5→IE6再インストール ・regsvr32 urlmon.dllの実行 ・regsvr32 actxprxy.dllの実行 ・regsvr32 shdocvw.dllの実行 ・一時ファイルの削除 (上記作業後は毎回リブートした)

専門家に質問してみよう