Vba как запустить приложение через shell
Иногда бывает нужно запустить или остановить « внешнее » приложение. О том, как это делается и пойдёт речь в данной статье.
Существует несколько способов запуска приложения:
1. Можно использовать стандартную функцию Visual Basic - Shell:
Shell "C:/Program files/WinRar/WinRar.exe", vbNormalFocus "// Запускаем WinRar.exe, окно программы получит фокус и сохранит стандартные размеры
2. Также можно воспользоваться функциями API:
"// Функция для запуска приложения (выполнения командной строки)
Declare Function WinExec Lib "kernel32" Alias "WinExec" (ByVal lpCmdLine As String, ByVal nCmdShow As Long) As Long
"// lpCmdLine - командная строка
"// nCmdShow - соответсвующая константа
"// Константы
Const SW_SHOWNORMAL = 1 "// Исходные размеры и состояние. Фокус
WinExec "calc.exe", SW_SHOWNORMAL "// Запуск Калькулятора в нормальном состоянии
3. Способ, позволяющий открыть приложение ассоциированное с данным типом файлов:
"// Функция для открытия приложения
Declare Function ShellExecute& Lib "shell32.dll" Alias "ShellExecuteA" (ByVal hwnd As Long, ByVal lpOperation As String, ByVal lpFile As String, ByVal lpParameters As String, ByVal lpDirectory As String, ByVal nShowCmd As Long)
Declare Function GetDesktopWindow Lib "user32" () As Long "// Функция для получения манипулятора рабочего стола
"// Константы
Const SW_SHOWNORMAL = 1
Call ShellExecute(GetDesktopWindow, "Open", "C:/Text.txt", "", "c:/", SW_SHOWNORMAL)
В данном примере открывается файл C:/Text.txt.
Остановка выполнения
Для остановки выполнения приложения необходимо знать манипулятор его главного окна. Найти этот манипулятор вы можете по заголовку, по классу и т.д., способов достаточно много.
Предполагается, что манипулятор вы нашли. Далее, опять же есть несколько способов:
Visual Basic не предоставляет средств, позволяющих закрыть чужое приложение, поэтому воспользуемся API. Для начала используем функцию SendMessage:
"// Константы
Const WM_CLOSE = &H10
SendMessage hwnd, WM_CLOSE, 0, 0 "// hwnd - манипулятор окна
Кроме этого можно остановить приложение принудительно:
"// Функция получает идентификатор процесса, связанного с ним окна
Declare Function GetWindowThreadProcessId Lib "user32" (ByVal hwnd As Long, lpdwProcessId As Long) As Long
"// Открывает манипулятор существующего процесса
Declare Function OpenProcess Lib "kernel32" (ByVal dwDesiredAccess As Long, ByVal bInheritHandle As Long, ByVal dwProcessId As Long) As Long
"// Функция уничтожает процесс
Declare Function TerminateProcess Lib "kernel32" (ByVal hProcess As Long, ByVal uExitCode As Long) As Long
"// Функция закрывает процесс
Declare Function CloseHandle Lib "kernel32" (ByVal hObject As Long) As Long
"// Константы
Const PROCESS_TERMINATE = &H1
"// Процедура закрытия приложения
Private Sub CloseProgram (hwnd As Long) "// hwnd - манипулятор окна
Dim pID As Long
Dim hProc As Long
GetWindowThreadProcessId hwnd, pID "// Получаем идентификатор процесса
hProc = OpenProcess(PROCESS_TERMINATE, False, pID) "// Открываем процесс
TerminateProcess hProc, 0 "// Уничтожаем процесс
CloseHandle hProc
End Sub
Запускает исполняемую программу и возвращает значение Variant (Double), представляющее идентификатор задачи программы в случае успешного выполнения и ноль в противном случае.
Синтаксис
Shell(путь, [ тип_окна ])
Синтаксис функции Shell использует следующие именованные аргументы:
Part | Описание |
---|---|
путь | Обязательный элемент; Variant (String). Имя программы, которую требуется выполнить, и все требуемые аргументы или параметры командной строки; может включать в себя каталог или папку и диск. В macOS можно использовать функцию MacID для указания подписи приложения вместо его имени. В следующем примере используется подпись для Microsoft Word: Shell MacID("MSWD") |
тип_окна | Необязательный элемент. Значение типа Variant (Integer), определяющее тип окна, в котором будет запущена программа. Если аргумент тип_окна опущен, программа запускается в свернутом окне с фокусом на нем. В Mac OS 7.0 и более поздних версиях аргумент тип_окна определяет лишь то, получит ли запускаемое приложение фокус. |
Аргумент тип_окна может принимать следующие значения:
Константа | Значение | Описание |
---|---|---|
vbHide | 0 | Окно скрыто, фокус переходит к скрытому окну. Константа vbHide не действует в macOS. |
vbNormalFocus | 1 | Окно получает фокус и восстанавливает свое исходное положение и размер. |
vbMinimizedFocus | 2 | Окно отображается в виде значка и получает фокус. |
vbMaximizedFocus | 3 | Окно разворачивается во весь экран и получает фокус. |
vbNormalNoFocus | 4 | Восстанавливается последнее положение и размер окна. Активное окно остается активным. |
vbMinimizedNoFocus | 6 | Окно отображается в виде значка. Активное окно остается активным. |
Примечания
Если функция Shell успешно запускает указанный файл, возвращается код задачи запущенной программы. Код задачи — это уникальный номер, идентифицирующий запускаемую программу. Если функция Shell не может запустить указанную программу, возникает ошибка.
В macOS при указании параметра vbNormalFocus, vbMinimizedFocus или vbMaximizedFocus приложение становится активным. При указании параметров vbHide, vbNoFocus или vbMinimizeFocus приложение запускается в фоновом режиме.
По умолчанию функция Shell запускает другие программы асинхронно. Это значит, что программа, запущенная с помощью команды Shell, может не завершиться до того, как будут выполнены операторы, следующие за функцией Shell. Сведения об ожидании завершения программы см. в статье Определение времени окончания процесса в оболочке.
Пример
В этом примере функция Shell используется для запуска указанного пользователем приложения. В macOS диск по умолчанию обозначается "HD", а части аргумента "путь" отделяются друг от друга двоеточиями вместо обратной косой черты. Аналогичным образом, следует указывать папки macOS вместо \WINDOWS .
См. также
Поддержка и обратная связь
Есть вопросы или отзывы, касающиеся Office VBA или этой статьи? Руководство по другим способам получения поддержки и отправки отзывов см. в статье Поддержка Office VBA и обратная связь.
Если значение функции присваивается переменной, параметры должны быть заключены в скобки. Если функция Shell используется только для запуска программы из кода VBA Excel, параметры должны быть указаны без скобок.
Параметры
Параметры функции Shell:
Параметр | Описание |
---|---|
pathname | Обязательный параметр. Значение типа Variant (String), задающее имя программы, которую требуется выполнить, и которое может включать диск, каталоги и папки, а также дополнительные параметры при использовании cmd. |
windowstyle | Необязательный параметр. Значение типа Variant (Integer), задающее стиль окна, в котором будет запущена программа. Если аргумент windowstyle опущен, программа запускается в свернутом окне и получает фокус. |
Константы
Константы VBA Excel, задающие стиль окна (windowstyle):
Константа | Значение | Описание |
---|---|---|
vbHide | 0 | Окно скрыто, фокус переходит к скрытому окну. |
vbNormalFocus | 1 | Окно восстанавливает свое исходное положение и размер, а также получает фокус. |
vbMinimizedFocus | 2 | Окно отображается в виде значка, а также получает фокус. |
vbMaximizedFocus | 3 | Окно разворачивается на весь экран, а также получает фокус. |
vbNormalNoFocus | 4 | Окно восстанавливает свое исходное положение и размер, но фокус не получает. |
vbMinimizedNoFocus | 6 | Окно отображается в виде значка, но фокус не получает. |
Примечания
- Если функция Shell успешно запускает указанную программу, возвращается код (идентификатор) задачи запущенной программы (ID процесса в Диспетчере задач). Если функция Shell не может запустить указанную программу из кода VBA Excel, происходит ошибка.
- Если в полном имени запускаемой программы содержатся пробелы, полное имя программы следует заключить в тройные кавычки (три пары двойных кавычек): """C:\Program Files\Папка программы\имя.exe""" .
- По умолчанию функция Shell запускает другие программы асинхронно. Это означает, что программа, запущенная с помощью команды Shell, может не завершиться до того, как будут выполнены операторы, следующие за функцией Shell.
Примеры
Пример 1
Запустим с помощью функции Shell программу Notepad++, отобразим идентификатор задачи в информационном окне MsgBox и сравним его с ID процесса в Диспетчере задач.
Используем в параметре pathname тройные кавычки (три пары двойных кавычек), так как полное имя файла содержит пробелы:
Для начала мы рассмотрим теоретическую часть, а потом приступим к программированию.
Run (strCommand, [intWindowStyle], [bWaitOnReturn]) – данный метод служит для запуска другого приложения как в консольном режиме (командная строка), так и в оконном. При открытии исполняемого файла создается новый процесс. Ему передаются следующие параметры:
strCommand – данный параметр является обязательным, поскольку задает путь для файла или команды. Стоит учитывать, что если путь содержит пробелы, то его обязательно стоит заключать в двойные кавычки, иначе, возникнет ошибка " The system cannot find the file specified " – система не может найти указанный файл. Также полезно, использовать переменные окружения в пути к приложению, это экономит время.
intWindowStyle – является необязательным, и задает стиль окна. Параметр может принимать целые значения от 0 до 10. Согласно документации, в языке vbscript можно использовать именованные константы, но, они не всегда дают ожидаемый результат, и так как эти значения между собой повторяются, я упомянул лишь три:
- 0 – скрывает окно, будет виден только процесс в диспетчере задач.
- 1 – нормальный режим
- 2 – свернутый вид
- 3 – развернутый вид
bWaitOnReturn – может принимать true – сценарий будет ожидать завершения работы запущенного приложения, и только потом перейдет к выполнению следующей строчки кода, false – будет продолжатся выполнение сценария независимо от того, завершилась работа запущенного приложения или нет. Также следует учесть, что если установлено true, то метод вернет код выхода вызванного приложения, если установлено false – всегда будет возвращаться ноль.
Хорошо, теперь настало время заняться программирование. Для начала напишем программный код на языке VBScript:
Хорошо, теперь давайте посмотрим на аналогичный пример, но написанный уже на языке jscript.
В данном примере, мы видим, что для команды Run мы прописали второй параметр (1 – нормальный режим), если этого не сделать, то произойдет ошибка, язык jscript не дает нам возможности пропустить параметр. Также видим, что тут не нужно использовать дополнительное ключевое слово типа set.
WScript Shell Run
Хорошо, теперь давайте посмотрим на еще один пример на языке vbscript.
В этом примере мы также запустили приложение notepad, но, не прописывали путь к нему. Дело в том, что команда Run объекта Wscript.Shell работает как команда " Windows Пуск/Выполнить ", и при запуске приложения, сперва идет его поиск в переменных средах Windows, в которые, и входит папка System32 . Также видим, что мы передали программе содержимое нашего сценария (строка WScript.ScriptFullName), фактически, скопировали в него весть текст скрипта.
Ну и напоследок, аналогичный пример, но уже на языке jscript:
И так, давайте все подытожим… В этой статье мы разобрали метод Run класса Wscript Shell, который позволяет запускать заданное приложение, и передавать ему нужные параметры, так, мы можем открыть текстовый редактор и вставить в него нужный текст. Аналогично, можно использовать и метод Exec, который тоже позволяет запускать исполняемый файл, но в отличии от метода Run, он позволяет контролировать работу исполняемого файла.
Спасибо за внимание. Автор блога Владимир Баталий
Читайте также: