tagCANDY CGI VBレスキュー(花ちゃん) - VBレスキュー(花ちゃん)の投稿サンプル用掲示板 - Visual Basic 6.0 VB2005 VB2010
VB2005用トップページへVBレスキュー(花ちゃん)のトップページVB6.0用のトップページ
VBレスキュー(花ちゃん)の投稿サンプル用掲示板
     サンプル投稿用掲示板  VB2005 〜 用トップページ  VB6.0 用 トップページ
現在起動中の全ての InternetExplorer の Document を取得する(VB.NET) ( No.0 )  [親スレッドへ]
日時: 2013/02/15 13:11
名前: VBレスキュー(花ちゃん)

***********************************************************************************
* カテゴリー:[インターネット][][]                          *
* キーワード:WebBrowser,ブラウザ,タイトル,Internet Explorer,複数起動,起動中,IE   *  
***********************************************************************************
タイトル:IE8で複数起動されたブラウザを強制終了したい
記 事 No:11034
投 稿 日:2013/02/04(Mon) 12:23  修正版:2013/02/12 14:45 再UP
元質問者:ぱぱ  
-----------------------------------------------------------------------------------
終了するといった外部アプリを作成しております。
プロセス一覧を取得し、IEブラウザを終了する動作は正常にいっているのですが、
ブラウザを複数起動した場合に、IEのメインタイトルは取得できますが、サブタイトル??が
取得できずにIEブラウザが終了しない場合があります。
現在コーディング中のソースを下記に添付致します。

'IEのプロセス一覧取得
Dim ps As Process() = Process.GetProcessesByName("iexplore")
For Each p As System.Diagnostics.Process In ps
    'ウィンドウタイトル取得
    strWkTitle = Trim(p.MainWindowTitle) ←メインタイトルしか取得できない。
    If strWkTitle <> "" Then
    '該当するIEブラウザであれば終了させる処理
    End If
Next
-----------------------------------------------------------------------------------
記事No : 11036
投稿日 : 2013/02/05(Tue) 00:09
投稿者 : VBレスキュー(花ちゃん)  
'===================================================================================================
'SampleNo:467    2013/02/05     @ 2013/02/05
'タイトル:現在起動中の全ての InternetExplorer の Document を取得する(467) - VB2010
'動作確認:WindowsVista / Windows 7 / VB2010 Pro SP1Rel / Framework 4.0 SP1Rel/ ターゲットCPU:X86
'          Excel 2007 / Excel 2010 / Internet Explorer 9.0 /
'[Option Compare Text] [Option Explicit On] [Option Infer On] [Option Strict Off]で設定
'---------------------------------------------------------------------------------------------------
'プロジェクト→参照の追加→COM で Microsoft Internet controls(SHDocVw.dll) を参照設定しておいて下さい。
'ソースコードは、保存オプションの詳細設定で、日本語(シフトJIS)-コードページ932 で保存しております。
'========1=========2=========3=========4=========5=========6=========7=========8=========9=========0

起動中の InternetExplorer の取得(列挙)だけなら Process.GetProcesses() で取得できるのですが、どの
IE かを特定しずらいので、個別に Document を取得してタイトル等で判別すべく試したものです。

この場合、com オブジェクトを扱ってはいるのだが、Excel のように ReleaseComObject を実行しないと
タスクマネージャ上の iexplore.exe が残ったままになるといった現象はおきにくいのですが、エラーが
発生した場合とか 起動中の IE を閉じた場合とかには必要な場合がありますので、状況に合わせて修正
願います。

尚、フレームのページのような場合は、再帰処理等が必要になり、場合によってはアクセス拒否等が発生する
場合がありますので、エラーが発生した場合とかは、終了時、タスクマネージャ上に iexplore.exe が
残ったままになっていないか確認しておいて下さい。

注意
Internet Explorer 4.0 以降では、フレームをまたがるセキュリティが実装されており、フレームの
ドメインとフレーム内ページのドメインが異なるような場合等に、アクセスを許可されない仕様になって
いるようです。(アクセス拒否のエラーが発生する) 詳しくは、下記リンクをご覧下さい。
 http://support.microsoft.com/default.aspx?scid=kb;ja;167796

例、 Programming Library - VB-VC-Delphi総合情報ページ で掲示板を表示した場合。
  メインフレームのアドレス  http://homepage1.nifty.com/MADIA/
  左のフレーム内のアドレス    http://homepage1.nifty.com/MADIA/index_frame.htm
  右のフレーム(掲示板)    http://hpcgi1.nifty.com/MADIA/vbnet/wwwlng.cgi

----------------------------------------------------------------------------------------------------

一応再帰的に処理する方法と単純な方法の両方を投稿しておきます。

VB.NET 系から InternetExplorer を扱う場合は、他の方法がないような場合に限定するようにして下さい。
'---------------------------------------------------------------------------------------------------


'無難なので、Option Strict Off で実行して下さい。

Option Strict Off

Public Class Form1

Private Sub Button1_Click(sender As System.Object, e As System.EventArgs) Handles Button1.Click

   TextBox1.Text = ""

   '参照設定をしないならこちらで
   'Dim oSW As Object = GetObject("new:9BA05972-F6A8-11CF-A442-00A0C90A8F39")

   'Interop.SHDocVw.dll を参照する場合
   Dim oSW As New SHDocVw.ShellWindows
   Dim oWB As Object = Nothing   'New   SHDocVw.InternetExplorer
   'IEがすでに起動中であるかを確認(起動中のエクスプローラも含まれる)
   For Each oWB In oSW
   'エクスプローラは除外する
   If TypeName(oWB.Document) = "HTMLDocumentClass" Then
      Dim oDc As Object = oWB.Document
      '現在IEのアドレスバーに表示しているURLを取得
      TextBox1.Text &= oDc.Title & vbCrLf
      '現在IEのアドレスバーに表示している Document 内のタイトルを取得
      TextBox1.Text &= oDc.url & vbCrLf
      If oDc.All.tags("frame").length >= 1 Then
         TextBox1.Text &= New String("-", 40) & vbCrLf
         'フレームを使っている場合は、フレーム内に表示している分も取得
         Call GetFrames(oDc)
      End If
      TextBox1.Text &= New String("=", 80) & vbCrLf & vbCrLf
      MRComObject(oDc)  'Com オブジェクトの解放処理へ
   End If
   Next
   MRComObject(oWB)     'Com オブジェクトの解放処理へ
   MRComObject(oSW)     'Com オブジェクトの解放処理へ

End Sub

Private Sub GetFrames(ByVal ieDoc As Object)
   'フレーム内のWEBページを再帰的に取得する
   Dim i As Long
   Try
      For i = 0 To ieDoc.All.tags("frame").length - 1
         'サイトによっては、アクセス拒否のエラーが発生する
         If ieDoc.frames.Item(i).Document.All.tags("frame").length = 0 Then
            TextBox1.Text &= ieDoc.frames.Item(i).Document.Title & vbCrLf
            TextBox1.Text &= ieDoc.frames.Item(i).Document.url & vbCrLf
         ElseIf ieDoc.frames.Item(i).Document.All.tags("frame").length >= 1 Then
            Call GetFrames(ieDoc.frames.Item(1).Document)
         End If
      Next
   Catch ex As Exception
      MessageBox.Show(ex.Message)
   End Try
End Sub


#Region "COMオブジェクトの参照カウントをデクリメントする処理(MRComObject)"

'今まで使っていた方法では、Option Strict On の時にエラーとなったので、下記の
'魔界の仮面弁士さんの投稿を使用させて頂きました。詳しくは、下記を参照してください。
' http://www.hanatyan.sakura.ne.jp/vbnetbbs/wforum.cgi?mode=allread&no=6370#6374

'VB2005/VB2008/VB2010 用
''' <summary>
''' COMオブジェクトの参照カウントをデクリメントします。
''' </summary>
''' <typeparam name="T">(省略可能)</typeparam>
''' <param name="objCom">
''' COM オブジェクト持った変数を指定します。
''' このメソッドの呼出し後、この引数の内容は Nothing となります。
''' </param>
''' <param name="force">
''' すべての参照を強制解放する場合はTrue、現在の参照のみを減ずる場合はFalse。
''' </param>
Public Shared Sub MRComObject(Of T As Class)(ByRef objCom As T,
                   Optional ByVal force As Boolean = False)
If objCom Is Nothing Then
  Return
End If
Try
  If System.Runtime.InteropServices.Marshal.IsComObject(objCom) Then
   If force Then
    System.Runtime.InteropServices.Marshal.FinalReleaseComObject(objCom)
   Else
    System.Runtime.InteropServices.Marshal.ReleaseComObject(objCom)
   End If
  End If
Finally
  objCom = Nothing
End Try
End Sub

#End Region


#Region "参考コード"

Private Sub Button2_Click(sender As System.Object, e As System.EventArgs) Handles Button2.Click
'フレーム内を無視するなら下記でも同様に動作します。
   Dim oSW As New SHDocVw.ShellWindows
   Dim oWb As SHDocVw.ShellBrowserWindow = Nothing
   TextBox1.Text = ""
   Try
      For Each oWb In oSW
         If TypeName(oWb.Document) = "HTMLDocumentClass" Then
            TextBox1.Text &= oWb.LocationName & vbCrLf
            TextBox1.Text &= oWb.LocationURL & vbCrLf & vbCrLf
            'oWb.Quit()  'InternetExplorer を終了させる場合
         End If
      Next
   Catch ex As Exception
      MessageBox.Show(ex.Message)
   Finally
      MRComObject(oWb)
      MRComObject(oSW)
   End Try
End Sub

#End Region

End Class

----------------------------------------------------------------------------------------------------

当サイト他、下記のようなサイトでも、OK
http://heo.jp/tag/page/frame/sample2/s08.html

NG なサイト(色々なサイトを試したがNGは下記だけです。他にあればご報告を。
http://homepage1.nifty.com/MADIA/  で特に、掲示板をフレームに表示した場合。


※ 尚、エラーが発生した場合等、IE をすべて終了しているにも拘わらず、タスク マネージャ内に
  iexplore.exe が残っていないかを確認しておいて下さい。

上記プログラム実行図(画像をクリックすると元のサイズで見られます。)



 [スレッド一覧へ] [親スレッドへ]