Закрыть стороннюю программу

Программирование на Visual Basic, главный форум. Обсуждение тем программирования на VB 1—6.
Даже если вы плохо разбираетесь в VB и программировании вообще — тут вам помогут. В разумных пределах, конечно.
Правила форума
Темы, в которых будет сначала написано «что нужно сделать», а затем просьба «помогите», будут закрыты.
Читайте требования к создаваемым темам.
DuckTale
Начинающий
Начинающий
 
Сообщения: 2
Зарегистрирован: 19.09.2010 (Вс) 0:08

Закрыть стороннюю программу

Сообщение DuckTale » 19.09.2010 (Вс) 0:19

Здравствуйте!

Я сразу извиняюсь за заезженную тему, но поиск по форуму толку мне не дал. К сожалению, я знаю язык только на уровне if..else :D и всякие API-функции для меня тёмный лес непроходимый =)

Понадобилось написать для личных нужд небольшую программку. Она по нажатию на кнопку должна закрывать другую программу. Окно закрываемой программы имеет название, которое никогда не меняется и в диспетчере задач отображается как "Экспорт данных для бухгалтера [ver. 0.9]"

Как завершить эту программу по нажатию кнопки в моей программе? Можно попросить вас написать код, который я бы просто мог вставить в форму с одной кнопкой с дефолтными именами? :oops: если вам не сложно :oops:

NeverGone
Продвинутый пользователь
Продвинутый пользователь
 
Сообщения: 107
Зарегистрирован: 11.11.2007 (Вс) 21:05
Откуда: Москва

Re: Закрыть стороннюю программу

Сообщение NeverGone » 19.09.2010 (Вс) 2:14

На основном сайте была статья под названием «Найти её и уничтожить». Там было как раз про то, что тебе нужно.
@Хакер: куда сайт-то пропал? <body><center><div></div></center></body> и всё… :(

0xy
Бывалый
Бывалый
 
Сообщения: 223
Зарегистрирован: 14.06.2006 (Ср) 2:34

Re: Закрыть стороннюю программу

Сообщение 0xy » 20.09.2010 (Пн) 22:43

DuckTale
Для начала, попробуйте простейший способ:
Код: Выделить всё
AppActivate "Экспорт данных для бухгалтера"
SendKeys "%({F4})", True

Vova_2581
Постоялец
Постоялец
 
Сообщения: 376
Зарегистрирован: 10.01.2010 (Вс) 18:08

Re: Закрыть стороннюю программу

Сообщение Vova_2581 » 22.09.2010 (Ср) 0:15

SendKeys F4 или SendMessage WM_CLOSE могут не сработать, если оконная процедура субклассируется на свой обработчик отвергающий эту команду.
Гораздо надежнее выгрузить противную прогу принудительно из процессов.
Проще всего использовать для этого THL вместе с TerminateProcess.
DuckTale писал(а):в диспетчере задач отображается как "Экспорт данных для бухгалтера [ver. 0.9]"

-- выдели мышой и в контекстном меню нажми "Перейти к процессам" он тебе подсветит exe-шник, вставь его в этот код вместо calc.exe.
Код: Выделить всё
Option Explicit

Private Type PROCESSENTRY32
    dwSize As Long
    cntUsage As Long
    th32ProcessID As Long
    th32DefaultHeapID As Long
    th32ModuleID As Long
    cntThreads As Long
    th32ParentProcessID As Long
    pcPriClassBase As Long
    dwFlags As Long
    szExeFile As String * 260
End Type

Private Declare Function OpenProcess Lib "kernel32" (ByVal dwDesiredAccess As Long, ByVal bInheritHandle As Long, ByVal dwProcessId As Long) As Long
Private Declare Function TerminateProcess Lib "kernel32" (ByVal hProcess As Long, ByVal uExitCode As Long) As Long
Private Declare Function CreateToolhelpSnapshot Lib "kernel32" Alias "CreateToolhelp32Snapshot" (ByVal lFlags As Long, ByVal lProcessID As Long) As Long
Private Declare Function Process32First Lib "kernel32" (ByVal hSnapShot As Long, uProcess As PROCESSENTRY32) As Long
Private Declare Function Process32Next Lib "kernel32" (ByVal hSnapShot As Long, uProcess As PROCESSENTRY32) As Long
Private Declare Sub CloseHandle Lib "kernel32" (ByVal hPass As Long)

Private Sub ProcessKiller_Click()
' Убъем процесс калькулятора
On Error Resume Next
Dim hProcess, hSnapShot, nProcess As Long
Dim uProcess As PROCESSENTRY32
  hSnapShot = CreateToolhelpSnapshot(2, 0) 'THL - снимок всех процессов
  uProcess.dwSize = LenB(uProcess)
  nProcess = Process32First(hSnapShot, uProcess)
Do While nProcess
   uProcess.szExeFile = LCase(uProcess.szExeFile)
   uProcess.szExeFile = Left(uProcess.szExeFile, InStr(1, uProcess.szExeFile, Chr(0)) - 1)
   If Trim(uProcess.szExeFile) = "calc.exe" Then 'Находим процесс
     hProcess = OpenProcess(&H1F0FFF, 1, uProcess.th32ProcessID)
     TerminateProcess hProcess, 0 'Принудительно завершаем процесс
     Exit Sub
   End If
    nProcess = Process32Next(hSnapShot, uProcess)
Loop
  CloseHandle hSnapShot
End Sub

0xy
Бывалый
Бывалый
 
Сообщения: 223
Зарегистрирован: 14.06.2006 (Ср) 2:34

Re: Закрыть стороннюю программу

Сообщение 0xy » 22.09.2010 (Ср) 19:31

Ну зачем же сразу грубо убивать процесс? Так можно потерять данные.
А найти процесс можно гараздо проще:
Код: Выделить всё
Private Declare Function FindWindow& Lib "user32" Alias "FindWindowA" (ByVal lpClassName$, ByVal lpWindowName$)
Private Declare Function GetWindowThreadProcessId& Lib "user32" (ByVal hwnd&, lpdwProcessId&)
Private Declare Function OpenProcess& Lib "kernel32" (ByVal dwDesiredAccess&, ByVal bInheritHandle&, ByVal dwProcessId&)
Private Declare Function TerminateProcess& Lib "kernel32" (ByVal hProcess&, Optional ByVal ExitCode&)
Private Declare Function SendMessage& Lib "user32" Alias "SendMessageA" (ByVal hwnd&, ByVal wMsg&, ByVal wParam&, lParam As Any)
Const PROCESS_TERMINATE=1&
Const WM_CLOSE = &H10&
'_____________________________________________________________

Sub CloseWrongApp(Optional WindowText$="Экспорт данных для бухгалтера [ver. 0.9]")
SendMessage FindWindow(vbNullString, WindowText), WM_CLOSE, 0, 0
Dim ProcessID&
GetWindowThreadProcessId FindWindow(VbNullString,WindowText),ProcessID
If ProcessID Then TerminateProcess(OpenProcess((PROCESS_TERMINATE,False,ProcessID))
End Sub

DuckTale
Начинающий
Начинающий
 
Сообщения: 2
Зарегистрирован: 19.09.2010 (Вс) 0:08

Re: Закрыть стороннюю программу

Сообщение DuckTale » 27.09.2010 (Пн) 22:25

Огромное СПАСИБО =)))

вы настоящие профессионалы =)


Вернуться в Visual Basic 1–6

Кто сейчас на конференции

Сейчас этот форум просматривают: AhrefsBot, Google-бот, Yandex-бот и гости: 98

    TopList