Этот вопрос может быть немного старый, но я полагаю, что этот ответ может все еще быть в состоянии помочь. (Испытано с Excel VBA, не был в состоянии проверить с Access)
WshShell.Exec Метод позволяет использовать .StdIn, .StdOut и функции .StdErr писать и читать из окна CONSOL. Метод WshShell.Run не позволяет использовать эту функцию, поэтому для некоторых целей используется Exec.
Несмотря на то, что нет встроенной функции для запуска метода Exec, сведенного к минимуму или скрытого, вы можете использовать API, чтобы быстро найти окно Exec hwnd и минимизировать/скрыть его.
Мой нижеприведенный скрипт берет ProcessID из объекта Exec, чтобы найти Hwnd окна. С помощью Hwnd вы можете установить состояние отображения окна.
Из моего тестирования с помощью Excel 2007 VBA, в большинстве случаев я даже не вижу окна ... В некоторых случаях он может отображаться в течение нескольких миллисекунд, но будет появляться только быстрое мерцание или мигать ... Примечание: I имел лучшие результаты с использованием SW_MINIMIZE, чем с SW_HIDE, но вы можете поиграть с ним.
Я добавил TestRoutine Sub, чтобы показать пример использования функции HideWindow. Функция 'HideWindow' использует функцию GetHwndFromProcess для получения окна hwnd из ProcessID.
Поместите ниже в модуль ...
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
GetWindowThr eadProcessId: http://msdn.microsoft.com/en-us/library/windows/desktop/ms633522%28v=vs.85%29.aspx
Если вам нужна дополнительная информация о работе API, быстрый поиск в Google предоставит вам массу информации.
Я надеюсь, что это может помочь ... Спасибо.
возможно дубликат [Хочу, чтобы скрыть окно командной строки при помощи метода WshShell.Exec] (http://stackoverflow.com/questions/15128517/want-to-hide-command -prompt-window-in-use-wshshell-exec-method) –
Увидел этот метод, но у него нет роскоши для перенаправления на файл - несколько пользователей. Надеялся, чтобы поддерживать принцип stdout. Будет продолжать искать thx –
Re: «не имеет роскоши для перенаправления на файл - несколько пользователей» - это то, что будет выполнено из front-end базы данных, и вы *** ***, убедившись, что каждый пользователь имеет их собственная локальная копия интерфейса, правильно ...? –