« Explorer.exeを起こして、そのエクスプローラのオブジェクトを正確に捕捉する。(VBA編) | トップページ | Explorer.exeを起こして、そのエクスプローラのオブジェクトを正確に捕捉する。(VBA編)(その3) »

2007年10月14日 (日)

Explorer.exeを起こして、そのエクスプローラのオブジェクトを正確に捕捉する。(VBA編)(その2)

Shell.Windows()の中から、起動したエクスプローラのオブジェクトを正確に捕捉するのは、なかなか厄介です。
特に、エクスプローラのインスタンスは、デスクトップシェルのプロセスに同居するので、識別が困難です。
しかし、もし、Explorer.exeを/separateで起こすなら、アプリパス名で識別することもできます。

アプリパス名は同じですが、大文字小文字をランダムに変えて、1/2**19の精度で特定します。
例) c:\winDOwS\exPlORer.ExE
これならWin32APIを使わずにできます。

Dim Shell As Object
Dim wShell As Object
Dim FullName As String
Dim k As Long
Dim ie As Object
Set Shell = CreateObject("Shell.Application")
Set wShell = CreateObject("WScript.Shell")
FullName = wShell.ExpandEnvironmentStrings("%windir%\explorer.exe")
Randomize
For k = 1 To Len(FullName)
  If Fix(Rnd * 2) Mod 2 Then
    Mid(FullName, k, 1) = UCase(Mid(FullName, k, 1))
  Else
    Mid(FullName, k, 1) = LCase(Mid(FullName, k, 1))
  End If
Next
Call VBA.Shell("""" & FullName & """ /separate", vbHide)
Do
  For Each ie In Shell.Windows()
    If ie.Visible Then
    ElseIf ie.FullName = FullName Then
      Exit Do
    End If
  Next
  Application.Wait [NOW()+"0:00:00.1"]
Loop
ie.Visible = True
MsgBox ie.FullName

« Explorer.exeを起こして、そのエクスプローラのオブジェクトを正確に捕捉する。(VBA編) | トップページ | Explorer.exeを起こして、そのエクスプローラのオブジェクトを正確に捕捉する。(VBA編)(その3) »