C++でInternet Explorerの各タブのページアドレスを取得する方法

このQ&Aのポイント
  • C++でInternet Explorerの各タブのページアドレスを取得する方法を探しています。プロセスの配列を取得するためにProcessクラスを使用し、GetProcessesByNameメソッドを利用することができます。また、WebBrowserクラスを使用してブラウザの操作を行うことができますが、ProcessのインスタンスをWebBrowserのインスタンスに代入する方法は分かりません。
  • C++でInternet Explorerの各タブのページアドレスを取得する方法を教えてください。ブラウザの操作にはProcessクラスとWebBrowserクラスを使用することができますが、ProcessのインスタンスをWebBrowserのインスタンスに代入する方法がわかりません。
  • C++でInternet Explorerの各タブのページアドレスを取得する方法を調べています。プロセスの配列を取得するためにProcessクラスを使用し、GetProcessesByNameメソッドを利用することができます。しかし、ProcessのインスタンスをWebBrowserのインスタンスに代入する方法がわかりません。どうすればよいでしょうか?
回答を見る
  • ベストアンサー

InternetExplolerで開いているページ

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

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

  • ベストアンサー
noname#212058
noname#212058
回答No.1

以前いろいろ調べたことがありますが、私の結論は 『ActiveX を使う以外に方策はない』でした。 System.Windows.Forms.WebBrowser は実は単 なる ActiveX のラッパーなので、質問者さんの要件 に合いません。『間接的に ActiveX を使うのはアリ』 ならば別ですが。 Process オブジェクトからはプロセスIDと標準入出力 くらいしか取れませんので、ここからブラウザのイン スタンスを取るのは不可能です。

paranoia23
質問者

お礼

やはりそうですよね。。 ◆マイクロソフトの公式ページ https://msdn.microsoft.com/ja-jp/library/dd163924.aspx これを見るにそもそもIEは、 Shdocvw.dll を内蔵しているので、自分は無理だと考えていたのですが、ある経緯で「これを使わずに」開発して欲しいということということで、調べていました。 自分は2ヶ月ぐらい、ちょこちょこと調べ続けていたのですが、 やはり、無理ですよね。。 ありがとうございました。

関連するQ&A

  • 【続・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オブジェクトに代入というようなことができたりするのかなぁ、、  と捉えています。

  • .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 の関係ってどういう関係?? となり、正しい認識を教えて頂きたいのです。 .

  • 起動済の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への変換は出来ないんでしょうか?

  • 重複起動の抑止

    お世話になっています。 Visual Basic.Netにて開発を行っております。 アプリケーションの重複起動を抑止するため、下記のようなコードを作成しました。 '自アプリプロセス名取得 Dim strProcName As String = System.Diagnostics.Process.GetCurrentProcess.ProcessName 'プロセスコンポーネントにリソースを関連付け procName = System.Diagnostics.Process.GetProcessesByName(strProcName) If UBound(procName) > 0 Then '重複起動 End If 上記コードにて重複起動チェックが行えていたのですが、 急に自アプリのプロセス名の取得時にエラーが発生するようになってしまいました。 (1行目で文字列を直接渡した場合、2行目で同様のエラーが発生します) エラーが発生する直前に行っていたことからエラー要因の確定ができると思うのですが、 今回は、まったく思い当たる節がございません。 エラー内容を見るとマシンの設定が変更されてしまっているようにも見えるのですが、 どこの設定値を変更すればよいのかご存知の方、または 他の重複起動チェックをご存知の方がいらっしゃいましたら、 申し訳ないのですがご教授頂けないでしょうか? Message "プロセス パフォーマンス カウンタは無効にされているため、要求された情報を実行できません。" StackTrace at System.Diagnostics.NtProcessManager.GetProcessInfos(PerformanceCounterLib library) at System.Diagnostics.NtProcessManager.GetProcessInfos(String machineName, Boolean isRemoteMachine) at System.Diagnostics.ProcessManager.GetProcessInfos(String machineName) at System.Diagnostics.Process.EnsureState(State state) at System.Diagnostics.Process.get_ProcessName() at Sample.Sample.Main() in *** Windows 2000 Pro SP3

  • FindWindiwSwでIEを取れない

    ActiveXのShdocvwの「FindWindowSW」は、 .NETのいずれかのクラスのメソッドで行うことはできるでしょうか? 【目的】 InternetExplorerを操作したい。 【案1】 ActiveXのShdocvwの「FindWindowSW」を使ってみたが挫折 FindWindowSW(urlアドレス, empty, 1, 0, 1) ⇒ ヒットしない。 【案2】 Process[] process = Process.GetProcessesByName("iexplore"); ⇒ ヒットしない。 【案3】 Enumwindowで取ったハンドルを、 Shdocvwを扱うポインタに紐付けて操作する。 ⇒ やりかたわからず。 ※本件は  http://okwave.jp/qa/q8845657.html を参考に進めました。

  • 特定ユーザーのプロセス情報を取得するには

    こんにちは。 VB.NET 2003で、現在起動されている全プロセスから、 特定のユーザーが起動した ・プロセスID ・プロセス名称 の情報を取得する方法はありますでしょうか? System.Diagnostics.Process.GetProcessesで、 プロセス情報が取得できるので、 その中から、特定のユーザーの情報だけを洗い出そうとしたのですが、 ユーザー名に当たるプロパティが見つけられませんでした。 Process クラスには、ユーザー名は持っていないのでしょうか? よろしくお願いいたします。

  • VC#2008の動作について

    VC#2008について、下記の場合、button1をクリックし、 その次に、button2をクリックしても全く反応しません。 どのように改良すれば反応しますか? 処理が重く止まったと感じた時、メッセージを表示した後、 アプリケーションを終了したいと思っています。 どなたかご存知の方、教えていただけないでしょうか? 宜しくお願い致します。 namespace WindowsFormsApplication1 { public partial class Form1 : Form { public Form1(){ InitializeComponent(); } private void button1_Click(object sender, EventArgs e) { System.Threading.Thread.Sleep(10000000); } private void button2_Click(object sender, EventArgs e) { MessageBox.Show("close"); System.Diagnostics.Process[] p = System.Diagnostics.Process.GetProcessesByName("myapp"); foreach (System.Diagnostics.Process k in p) { k.Kill(); } } } }

  • 別プロセスをの実行パスを取得したいのですが

    自作のアプリケーション実行中に、全く無関係の別のプロセス(つまりprocess.start()等でそのアプリケーションから実行したプロセスではないということです)をDiagnostics.Processクラスのオブジェクトとして取得することはできると思うのですが、取得したプロセスの実行パスを何とかして調べる方法はないものでしょうか?

  • 起動したIEのウインドウタイトルを取得する方法

    こんばんは。WindowsXP+VB.NET環境です。 IE = CreateObject("InternetExplorer.Application") IE.Navigate("http://www.yahoo.co.jp") でインターネットエクスプローラを起動した場合に IEのウインドウの上の部分に表示されている 「Yahoo! JAPAN - Microsoft Internet Explorer」という文字と プロセスIDとプロセス名を取得したいのですが どのようなコードを書けば良いでしょうか? WEBサイトで調べていたら起動中の全プロセスのものを全て表示する 方法はあったのですが、起動したIE限定で取得したいです。 IE.IdとかIE.ProcessName、IE.MainWindowTitleのようにしてみたのですが エラーになってしまいました。 あと、別の方法で Dim hProcess As System.Diagnostics.Process = System.Diagnostics.Process.Start("iexplore") hProcess.WaitForInputIdle() Dim pName As String = hProcess.MainWindowTitle としたら出来るようになったのですが、 起動した後に上の方法でやった時のようにIE.Navigate("http://****")で 移動したりしたいのですが、この方法で起動した場合の 方法が分からなくなってしまいました。 IE = CreateObject("InternetExplorer.Application")で起動したIEのように 操作できるようにする方法を教えて頂きたいです。よろしくお願い致します。

  • [C#]リモートアクセスのProcess取得で「アクセス拒否」

    現在、PCのプロセスを取得するプログラムを作っています。 しかし、リモートコンピューターからGetProcessesByNameでプロセスを取得しようとすると、アクセス拒否の例外が出てしまいます。 具体的には、以下のような例外をキャッチできるのですが、アクセス拒否されないために必要な条件となんでしょうか? またエラー回避策、ヒントなど、教えていただければ幸いです。 よろしくお願いします。 -------------------------------------- try{ Process [] targetProcess = Process.GetProcessesByName(プロセス名 , リモートコンピューター名); } catch(System.InvalidOperationException e){ Debug.WriteLine(e.Source + ":1" + e.Message); System.Exception se = e.InnerException; Debug.WriteLine(se.Source + ":2:" + se.Message); } -------------------------------------- ↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓ -------------------------------------- System:1:リモート コンピュータからプロセス情報を取得できませんでした。 System:2:アクセスが拒否されました。 -------------------------------------- 参考:http://oshiete1.goo.ne.jp/kotaeru.php3?q=1596734

専門家に質問してみよう