Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Visual Basic [игнор отключен] [закрыт для гостей] / Как закрыть приложение? / 16 сообщений из 16, страница 1 из 1
04.10.2005, 22:49
    #33304948
Kifir
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как закрыть приложение?
Помогите пожалуйста решить такой вопрос.
Допустим у меня открыт notepad.exe как мне его насильно закрыть (под xp)?
...
Рейтинг: 0 / 0
05.10.2005, 08:54
    #33305212
Как закрыть приложение?
Узнаем handle окна по его Caption и закрываем.

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
Declare Function FindWindow Lib "user32" Alias "FindWindowA" ( _
  ByVal lpClassName As String, _
  ByVal lpWindowName As String) As Long

Declare Function PostMessage Lib "user32" Alias "PostMessageA" ( _
  ByVal hwnd As Long, _
  ByVal wMsg As Long, _
  ByVal wParam As Long, _
  lParam As Any) As Long

Const WM_CLOSE = &H10

Sub CloseApp()
    Dim lngHwnd As Long
    Dim lngReturn As Long
    
    lngHwnd = FindWindow(vbNullString, "A.txt - Блокнот")
    
    'Debug.Print lngHwnd
    
    If lngHwnd <>  0  Then
        lngReturn = PostMessage(lngHwnd, WM_CLOSE,  0 &,  0 &)
        If lngReturn =  0  Then
            MsgBox "Произошла ошибка."
        End If
    Else
        MsgBox "Приложение не открыто."
    End If
End Sub

А можно по классу окна.

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
Declare Function FindWindow Lib "user32" Alias "FindWindowA" ( _
  ByVal strClassName As String, _
  ByVal lpWindowName As Any) As Long

Declare Function PostMessage Lib "user32" Alias "PostMessageA" ( _
  ByVal hwnd As Long, _
  ByVal wMsg As Long, _
  ByVal wParam As Long, _
  lParam As Any) As Long

Const WM_CLOSE = &H10

Function fctIsAppLoaded(ByVal varClassName As Variant) As Long
   If IsNull(varClassName) Then
      fctIsAppLoaded =  0 
   Else
      fctIsAppLoaded = FindWindow(CStr(varClassName),  0 &)
   End If
End Function

Sub CloseApp()
    If fctIsAppLoaded("notepad") <>  0  Then
        PostMessage fctIsAppLoaded("notepad"), WM_CLOSE,  0 &,  0 &
    Else
        MsgBox "Приложение не открыто."
    End If
End Sub
...
Рейтинг: 0 / 0
05.10.2005, 14:21
    #33306374
Kifir
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как закрыть приложение?
Хочу сообшить,что эти 2 кода не рабочие,т.е. они не закрывают прложение
...
Рейтинг: 0 / 0
05.10.2005, 14:35
    #33306433
Letter_D
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как закрыть приложение?
Можно через скрипт.
Код: plaintext
1.
2.
3.
4.
5.
6.
strComputer = "."
strProcsToKill = "notepad.exe"
Set wbemObjectSet = GetObject("winmgmts://" & strComputer).InstancesOf("Win32_Process")
For Each wbemObject In wbemObjectSet
 If LCase(wbemObject.Name) = strProcsToKill Then wbemObject.Terminate
Next
...
Рейтинг: 0 / 0
05.10.2005, 14:46
    #33306484
Как закрыть приложение?
KifirХочу сообшить,что эти 2 кода не рабочие,т.е. они не закрывают прложение
Не знаю как у тебя, у меня все работает.
...
Рейтинг: 0 / 0
06.10.2005, 16:19
    #33309538
Как закрыть приложение?
Так еще можно через VBS.

Код: plaintext
1.
2.
3.
4.
5.
    Dim objShell
    Dim CommandLine
    
    Set objShell = CreateObject("Wscript.Shell")
    CommandLine = "taskkill /f /im notepad.exe"
    objShell.Run CommandLine,  0 , True

Либо WinApi TerminateProcess.
...
Рейтинг: 0 / 0
Период между сообщениями больше года.
12.10.2006, 22:22
    #34052126
Kifir
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как закрыть приложение?
Хех, вспомнил как год назад просил о помощи закрыть процесс notepad, это оказалось легко... Но я заметил, что vb - язык слабофункциональный. Ибо я например хочу закрыть процесс Winlogon, этот процесс средствами vb не закроется.
Я сколько видел всяких примеров, и не 1 не справляется с задачей.
Посмотрев как работает утилита PsKill, которая закрывает ЛЮБОй процесс, хочу написать код на С и инегрировать dll в vb
Но вот в чем проблема. Кто бы подкинул бы код на дельфи или с, 100% рабочий код??? Или если все таки найдется великий программер, и код есть на vb, то прошу скинуть его сюда.
...
Рейтинг: 0 / 0
13.10.2006, 09:26
    #34052507
orunbek
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как закрыть приложение?
Пользователь2Так еще можно через VBS.

Код: plaintext
1.
2.
3.
4.
5.
    Dim objShell
    Dim CommandLine
    
    Set objShell = CreateObject("Wscript.Shell")
    CommandLine = "taskkill /f /im notepad.exe"
    objShell.Run CommandLine,  0 , True

Либо WinApi TerminateProcess.
я бы заместо WScript.Shell сделал бы следующее
Код: plaintext
1.
Shell "taskkill.exe /f /im notepad.exe"
...
Рейтинг: 0 / 0
17.12.2006, 23:12
    #34206095
MiCerg
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как закрыть приложение?
Dim Програма, Программы() As Process
Программы = Process.GetProcessesByName("clipbrd")
For Each Програма In Программы
Програма.Kill()
Next

Здесь я закрываю папку Буфер Обмена ("clipbrd"), можно (“excel”) и т.д.
Но Програма.Kill() убивает программу , т.е не сохраняет последние изменения, а вот
Программа.CloseMainWindow() пытается закрыть окна, в excel , появляется окно, предлагающее сохранить изменения
...
Рейтинг: 0 / 0
18.12.2006, 06:26
    #34206218
orunbek
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как закрыть приложение?
KifirХех, вспомнил как год назад просил о помощи закрыть процесс notepad, это оказалось легко... Но я заметил, что vb - язык слабофункциональный. Ибо я например хочу закрыть процесс Winlogon, этот процесс средствами vb не закроется.
Я сколько видел всяких примеров, и не 1 не справляется с задачей.
Посмотрев как работает утилита PsKill, которая закрывает ЛЮБОй процесс, хочу написать код на С и инегрировать dll в vb
Но вот в чем проблема. Кто бы подкинул бы код на дельфи или с, 100% рабочий код??? Или если все таки найдется великий программер, и код есть на vb, то прошу скинуть его сюда.
не согласен, ибо есть много способов закрытия процесса, таких как notepad.exe
а слабофункционален не VB, а человек который не может это реализовать
дорогой мой поищите в сети, там же куча примеров: API, WMI, command line и т.д. и т.д.
...
Рейтинг: 0 / 0
23.05.2007, 23:36
    #34547112
max_111
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как закрыть приложение?
Хороший пример отображения процессов и их завершение
Может кто тоже ищет :-)
Скачать

Сайт
...
Рейтинг: 0 / 0
Период между сообщениями больше года.
02.10.2008, 21:42
    #35573500
Дмитрий77
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как закрыть приложение?
orunbekя бы заместо WScript.Shell сделал бы следующее
Код: plaintext
1.
Shell "taskkill.exe /f /im notepad.exe"

Отличное решение!
А насколько я могу быть уверен, что taskkill.exe присутствует на любом-произвольном PC (хотя бы с XP и Win2003),куда может попасть моя программа? Насколько это приложение "системное"?
Или м.б. в дистрибутив его надо добавлять?
KifirХочу сообшить,что эти 2 кода не рабочие,т.е. они не закрывают прложение
Блокнот то они закрывают, а вот с другим произвольным приложением что-то с ходу не работает...

Скрипт работает на ура, но где гарантия что у usera будет установлен сервер сценариев?
...
Рейтинг: 0 / 0
02.10.2008, 22:15
    #35573533
White Owl
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как закрыть приложение?
Дмитрий77А насколько я могу быть уверен, что taskkill.exe присутствует на любом-произвольном PC (хотя бы с XP и Win2003),куда может попасть моя программа? Насколько это приложение "системное"?Начиная с XP Pro и 2003 - системное на 100%

Дмитрий77Скрипт работает на ура, но где гарантия что у usera будет установлен сервер сценариев?WSH часть системы начиная с 95 OCR2.
...
Рейтинг: 0 / 0
02.10.2008, 22:39
    #35573559
Дмитрий77
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как закрыть приложение?
White OwlНачиная с XP Pro и 2003 - системное на 100%.
А если попросить инталятор копировать его в system32(если его там нет)
оно будет работать скажем на произвольном Home Edition? (взять могу скажем с xp prof sp3)

White OwlWSH часть системы начиная с 95 OCR2.
Есть то оно есть, но на сколько я помню,в win98 по умолчанию не устанавливалось...
А как с XP и с 2003?

Есть в принципе готовая ф-ция, пользовал лет 8 назад...
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
Function EndTask(TargetHwnd As Long) As Long
    
    Dim rc As Integer
    Dim ReturnVal As Integer
    If TargetHwnd = Form1.hwnd Or GetWindow(TargetHwnd, _
        GW_OWNER) = Form1.hwnd Then
        End
    End If
    If IsWindow(TargetHwnd) = False Then
        GoTo EndTaskFail
    End If
    If (GetWindowLong(TargetHwnd, GWL_STYLE) _
        And WS_DISABLED) Then
        GoTo EndTaskSucceed
    End If
    
    'Close the window
    If IsWindow(TargetHwnd) Then
        If Not (GetWindowLong(TargetHwnd, GWL_STYLE) _
        And WS_DISABLED) Then
        rc = PostMessage(TargetHwnd, WS_CANCELMODE,  0 ,  0 &)
        rc = PostMessage(TargetHwnd, WM_CLOSE,  0 ,  0 &)
         DoEvents
        End If
    End If
    GoTo EndTaskSucceed
    
EndTaskFail:
    ReturnVal = False
    GoTo EndTaskEndSub
EndTaskSucceed:
    ReturnVal = True
EndTaskEndSub:
    EndTask = ReturnVal
End Function
Но не знаю, как получить этот TargetHwnd As Long
По идее код
lngHwnd = FindWindow(vbNullString, "proga.exe")
годится, но здесь требуется полное соответствие, а в окне может быть написано
"C:\bla-bla-bla\proga.exe" "Far ля ля ля -proga.exe" и т.п.
А "*proga.exe" не срабатывает.
...
Рейтинг: 0 / 0
03.10.2008, 00:13
    #35573621
White Owl
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как закрыть приложение?
Дмитрий77 White OwlНачиная с XP Pro и 2003 - системное на 100%.
А если попросить инталятор копировать его в system32(если его там нет)
оно будет работать скажем на произвольном Home Edition? (взять могу скажем с xp prof sp3)Не уверен, но кажется будет работать...

White OwlWSH часть системы начиная с 95 OCR2.
Есть то оно есть, но на сколько я помню,в win98 по умолчанию не устанавливалось...[/quot]Вот как раз с Win'98 OCR2 оно и ставится по умолчанию. В ME, XP, 2000, 2003 и тд есть во всех редакциях естественно.

Дмитрий77Есть в принципе готовая ф-ция, пользовал лет 8 назад...Это не совсем то, что делает taskkill. Твоя функция всего-лишь просит окно закрыться, а не убивает процесс как taskkill.

Дмитрий77Но не знаю, как получить этот TargetHwnd As Long
По идее код
lngHwnd = FindWindow(vbNullString, "proga.exe")
годится, но здесь требуется полное соответствие, а в окне может быть написано
"C:\bla-bla-bla\proga.exe" "Far ля ля ля -proga.exe" и т.п.
А "*proga.exe" не срабатывает.Да, верно. Но еще можно находить окна через первый параметр, если знаешь класс окна. Либо через EnumWindows пробежать по всем окнам и сделать "умный" разбор заголовков окна.
...
Рейтинг: 0 / 0
03.10.2008, 01:33
    #35573677
Дмитрий77
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как закрыть приложение?
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
Sub KillProga(proga As String)
    Do
        TargetName = proga
        TargetHwnd =  0 
        ' Examine the window names.
        EnumWindows AddressOf WindowEnumerator,  0 
        ' See if we got an hwnd.
        If TargetHwnd =  0  Then
            Exit Do
        Else
            EndTask (TargetHwnd)
        End If
    Loop
End Sub
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
Public Function WindowEnumerator(ByVal app_hwnd As Long, _
    ByVal lParam As Long) As Long
Dim buf As String *  256 
Dim title As String
Dim length As Long

    ' Get the window's title.
    length = GetWindowText(app_hwnd, buf, Len(buf))
    title = Left$(buf, length)

    ' See if the title contains the target.
    If InStr(title, TargetName) >  0  Then
        ' Save the hwnd and end the enumeration.
        TargetHwnd = app_hwnd
        WindowEnumerator = False
    Else
        ' Continue the enumeration.
        WindowEnumerator = True
    End If
End Function

Ну вот вроде так.
Мне только не очень нравится, что если напр. прога запущена из FAR, то она убивается вместе с ним, т.е. окно целиком как вы говорите, а не процесс
Процесс в принципе тоже убивается. Для данного конкретного случая вроде нормально, ибо прога запускается командой
Private Sub CommandSTART_Click()
If CheckConsole.Value = vbChecked Then
Shell "proga.exe", vbNormalFocus
Else
Shell "proga.exe", vbHide
End If
End Sub

А по повода сервера сценариев. В тех прогах и макросах, что использую на рабочих PC для внутр.пользования я его использую везде. Маленький парадокс: я таскаю во все системы scrrun.dll от первой !!! версии win98, во всех остальных какой-то глюк, понять не пытался до сих пор, что-то в FileSystemObject не так.
А сейчас мучаюсь -пытаюсь написать "коммерческий" вариант одного нужного решения, чем черт не шутит, м.б. есть смысл... сам костяк на C++ open source и т.д. и т.п., но оболочку пишу на VB ибо в нек. совершенстве владею только им.
...
Рейтинг: 0 / 0
Форумы / Visual Basic [игнор отключен] [закрыт для гостей] / Как закрыть приложение? / 16 сообщений из 16, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]