この質問は少し古いかもしれませんが、この回答がまだ役立つ可能性があると思います。(Excel VBA でテスト済み、Access ではテストできませんでした)
usncahillの回答と非常に似ていますが、ウィンドウが読み込まれるのをスリープまたは待機する代わりに、ループを続けてhwndを探し、見つかったらすぐに実行します。
以下のスクリプトは、Exec オブジェクトから ProcessID を取得して、ウィンドウの Hwnd を見つけます。Hwnd を使用すると、ウィンドウの表示状態を設定できます。
Excel 2007 VBA でのテストから、ほとんどの場合、ウィンドウが表示されることさえありません...場合によっては、数ミリ秒間表示されることがありますが、ちらつきや点滅のみが表示されます... 注: を使用すると、より良い結果が得られましたSW_HIDE で行ったよりも SW_MINIMIZE ですが、いじることができます。
「HideWindow」関数の使用方法の例を示すために、TestRoutine Sub を追加しました。「HideWindow」関数は、「GetHwndFromProcess」関数を使用して、ProcessID からウィンドウ hwnd を取得します。
以下をモジュールに配置します...
Option Explicit
' ShowWindow() Commands
Public Const SW_HIDE = 0
Public Const SW_MINIMIZE = 6
'GetWindow Constants
Public Const GW_CHILD = 5
Public Const GW_HWNDFIRST = 0
Public Const GW_HWNDLAST = 1
Public Const GW_HWNDNEXT = 2
Public Const GW_HWNDPREV = 3
Public Const GW_OWNER = 4
' API Functions
Public Declare Function ShowWindow Lib "user32" (ByVal hwnd As Long, ByVal nCmdShow As Long) As Long
Public Declare Function GetWindow Lib "user32" (ByVal hwnd As Long, ByVal wCmd As Long) As Long
Public Declare Function GetDesktopWindow Lib "user32" () As Long
Public Declare Function GetWindowThreadProcessId Lib "user32" (ByVal hwnd As Long, lpdwProcessId As Long) As Long
Sub TestRoutine()
Dim objShell As Object
Dim oExec As Object
Dim strResults As String
Set objShell = CreateObject("WScript.Shell")
Set oExec = objShell.Exec("CMD /K")
Call HideWindow(oExec.ProcessID)
With oExec
.StdIn.WriteLine "Ping 127.0.0.1"
.StdIn.WriteLine "ipconfig /all"
.StdIn.WriteLine "exit"
Do Until .StdOut.AtEndOfStream
strResults = strResults & vbCrLf & .StdOut.ReadLine
DoEvents
Loop
End With
Set oExec = Nothing
Debug.Print strResults
End Sub
Function HideWindow(iProcessID)
Dim lngWinHwnd As Long
Do
lngWinHwnd = GetHwndFromProcess(CLng(iProcessID))
DoEvents
Loop While lngWinHwnd = 0
HideWindow = ShowWindow(lngWinHwnd, SW_MINIMIZE)
End Function
Function GetHwndFromProcess(p_lngProcessId As Long) As Long
Dim lngDesktop As Long
Dim lngChild As Long
Dim lngChildProcessID As Long
On Error Resume Next
lngDesktop = GetDesktopWindow()
lngChild = GetWindow(lngDesktop, GW_CHILD)
Do While lngChild <> 0
Call GetWindowThreadProcessId(lngChild, lngChildProcessID)
If lngChildProcessID = p_lngProcessId Then
GetHwndFromProcess = lngChild
Exit Do
End If
lngChild = GetWindow(lngChild, GW_HWNDNEXT)
Loop
On Error GoTo 0
End Function
ShowWindow 関数:
http://msdn.microsoft.com/en-us/library/windows/desktop/ms633548%28v=vs.85%29.aspx
GetWindow 関数:
http://msdn.microsoft.com/en-us/library/windows/desktop/ms633515%28v=vs.85%29.aspx
GetDesktopWindow 関数:
http://msdn.microsoft.com/en-us/library/windows/desktop/ms633504%28v=vs.85%29.aspx
GetWindowThreadProcessId 関数:
http://msdn.microsoft.com/en-us/library/windows/desktop/ms633522%28v=vs.85%29.aspx
API の仕組みについてさらに詳しい情報が必要な場合は、簡単な Google 検索で大量の情報が得られます。
これが役立つことを願っています...ありがとう。