Explorer.exeを起こして、そのエクスプローラのオブジェクトを正確に捕捉する。(VBA編)
Shell.Windows()の中から、起動したエクスプローラのオブジェクトを正確に捕捉するのは、なかなか厄介です。
特に、エクスプローラのインスタンスは、デスクトップシェルのプロセスに同居するので、識別が困難です。
しかし、もし、Explorer.exeを/separateで起こすなら、プロセスIDで一意に識別できます。
VBAでは、Win32APIが使えるので、ウィンドウハンドルとプロセスIDを対応させて、一意に特定できます。
Option Explicit
Private Declare Function GetWindowThreadProcessId Lib "user32.dll" (ByVal hwnd As Long, ByRef ProcessId As Long) As Long
Function GetWindowProcessId(ByVal hwnd As Long) As Long
Dim ProcessId As Long
GetWindowThreadProcessId hwnd, ProcessId
GetWindowProcessId = ProcessId
End Function
Sub aaa()
Dim Shell As Object
Dim ProcessId As Long
Dim ie As Object
Set Shell = CreateObject("Shell.Application")
ProcessId = VBA.Shell("explorer.exe /separate", vbHide)
Do
For Each ie In Shell.Windows()
If ie.Visible Then
ElseIf GetWindowProcessId(ie.hwnd) = ProcessId Then
Exit Do
End If
Next
Application.Wait [NOW()+"0:00:00.1"]
Loop
ie.Visible = True
End Sub
« ExcelオートメーションでDDE要求を無視する。(その2) | トップページ | Explorer.exeを起こして、そのエクスプローラのオブジェクトを正確に捕捉する。(VBA編)(その2) »