- 日時: 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 が残っていないかを確認しておいて下さい。
  上記プログラム実行図(画像をクリックすると元のサイズで見られます。) 
 
  |