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