2017年9月
          1 2
3 4 5 6 7 8 9
10 11 12 13 14 15 16
17 18 19 20 21 22 23
24 25 26 27 28 29 30
無料ブログはココログ

« ExcelオートメーションでDDE要求を無視する。(その2) | トップページ | Explorer.exeを起こして、そのエクスプローラのオブジェクトを正確に捕捉する。(VBA編)(その2) »

2007年10月13日 (土)

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) »