Программирование на Visual Basic

Работа с другими приложениям

Введение

Иногда бывает нужно запустить или остановить «внешнее» приложение. О том, как это делается и пойдёт речь в данной статье.

Запуск

Существует несколько способов запуска приложения:

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:

"// Функция, посылающая сообщения окну
Declare Function SendMessage Lib "user32" Alias "SendMessageA" (ByVal hwnd As Long, ByVal wMsg As Long, ByVal wParam As Long, lParam As Any) As Long

"// Константы
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

Hosted by uCoz