powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Visual Basic [игнор отключен] [закрыт для гостей] / Закрыть окно
23 сообщений из 23, страница 1 из 1
Закрыть окно
    #33726713
Barsss
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Искал здесь но чтото не нашел конкретного ответа. Как закрыть окно, полностю закрыть чтоб и процес закрылся, зная название окна.
Помогите разобратся.
...
Рейтинг: 0 / 0
Закрыть окно
    #33726745
Melkiades
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Например, так .
...
Рейтинг: 0 / 0
Закрыть окно
    #33727176
Barsss
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Только эти коды действительно не работают, есть какие то соображения??
По крайней мере у меня.
...
Рейтинг: 0 / 0
Закрыть окно
    #33727202
Melkiades
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Какие коды? В смысле - программмный код? Так приведите его.
...
Рейтинг: 0 / 0
Закрыть окно
    #33727227
Barsss
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Те самые что вы советовали

MelkiadesНапример, так .




Код: 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
Закрыть окно
    #33727248
Melkiades
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Вы что, издеваетесь? Только что проверил этот код - он полностью работает.
Как и где вы его запускаете? Вы уверены, что посылаете в FindWindow привильный заголовок окна?
...
Рейтинг: 0 / 0
Закрыть окно
    #33727322
Barsss
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Вот так вот запускаю.
Модуль:
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

В Форме:

Private Sub Command1_Click()

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


При неправильном заголовке окна выскакивает MsgBox "Приложение не открыто."
при правильном названии ничего не происходит
...
Рейтинг: 0 / 0
Закрыть окно
    #33727408
Melkiades
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Странно.
В таком слукае после того как нашли нэндлер окна попробуйте использовать функции GetWindowThreadProcessId и TerminateProcess.
...
Рейтинг: 0 / 0
Закрыть окно
    #33727482
TIKO
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
попробуй убрать .txt
A - Блокнот
...
Рейтинг: 0 / 0
Закрыть окно
    #33727664
Barsss
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
TIKOпопробуй убрать .txt
A - Блокнот

MsgBox "Приложение не открыто."

Вот нашел код


Код: 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.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
74.
75.
76.
77.
78.
79.
80.
81.
82.
Private Declare Function FindWindow Lib "user32" _
            Alias "FindWindowA" _
            (ByVal lpClassName As Long, _
            ByVal lpWindowName As Long) As Long

Private Declare Function GetParent Lib "user32" _
            (ByVal hwnd As Long) As Long

Private Declare Function SetParent Lib "user32" _
            (ByVal hWndChild As Long, _
            ByVal hWndNewParent As Long) As Long

Private Declare Function GetWindowThreadProcessId Lib "user32" _
            (ByVal hwnd As Long, _
            lpdwProcessId As Long) As Long

Private Declare Function GetWindow Lib "user32" _
            (ByVal hwnd As Long, _
            ByVal wCmd As Long) As Long

Private Declare Function LockWindowUpdate Lib "user32" _
            (ByVal hwndLock As Long) As Long

Private Declare Function GetDesktopWindow Lib "user32" () As Long

Private Declare Function DestroyWindow Lib "user32" _
            (ByVal hwnd As Long) As Long

Private Declare Function TerminateProcess Lib "kernel32" _
            (ByVal hProcess As Long, _
            ByVal uExitCode As Long) As Long

Private Declare Function GetCurrentProcess Lib "kernel32" () As Long

Private Declare Function Putfocus Lib "user32" _
            Alias "SetFocus" _
            (ByVal hwnd As Long) As Long

Const GW_HWNDNEXT =  2 
Dim mWnd As Long
Function InstanceToWnd(ByVal target_pid As Long) As Long
    Dim test_hwnd As Long, test_pid As Long, test_thread_id As Long
    'Find the first window
    test_hwnd = FindWindow(ByVal  0 &, ByVal  0 &)
    Do While test_hwnd <>  0 
        'Check if the window isn't a child
        If GetParent(test_hwnd) =  0  Then
            'Get the window's thread
            test_thread_id = GetWindowThreadProcessId(test_hwnd, _
            test_pid)
            If test_pid = target_pid Then
                InstanceToWnd = test_hwnd
                Exit Do
            End If
        End If
        'retrieve the next window
        test_hwnd = GetWindow(test_hwnd, GW_HWNDNEXT)
    Loop
End Function

Private Sub Form_Load()
    Dim Pid As Long
    'Lock the window update
    LockWindowUpdate GetDesktopWindow
    'Execute notepad.Exe
    Pid = Shell("c:\winnt\notepad.exe", vbNormalFocus)
    If Pid =  0  Then MsgBox "Error starting the app"
    'retrieve the handle of the window
    mWnd = InstanceToWnd(Pid)
    'Set the notepad's parent
    SetParent mWnd, Me.hwnd
    'Put the focus on notepad
    Putfocus mWnd
    'Unlock windowupdate
    LockWindowUpdate False
End Sub

Private Sub Form_Unload(Cancel As Integer)
    'Unload notepad
    'DestroyWindow mWnd
    'End this program
    'TerminateProcess GetCurrentProcess, 0
End Sub



Код робочий пробовал но мне не надо с запуском тоисть без
Private Sub Form_Load()

А вот как прописать в Private Sub Form_Unload(Cancel As Integer)
чтоб оно закрывалось зная название окна и Hwnd
...
Рейтинг: 0 / 0
Закрыть окно
    #33727693
TIKO
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Barsss TIKOпопробуй убрать .txt
A - Блокнот

MsgBox "Приложение не открыто."

Вот нашел код


Код: 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.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
74.
75.
76.
77.
78.
79.
80.
81.
82.
Private Declare Function FindWindow Lib "user32" _
            Alias "FindWindowA" _
            (ByVal lpClassName As Long, _
            ByVal lpWindowName As Long) As Long

Private Declare Function GetParent Lib "user32" _
            (ByVal hwnd As Long) As Long

Private Declare Function SetParent Lib "user32" _
            (ByVal hWndChild As Long, _
            ByVal hWndNewParent As Long) As Long

Private Declare Function GetWindowThreadProcessId Lib "user32" _
            (ByVal hwnd As Long, _
            lpdwProcessId As Long) As Long

Private Declare Function GetWindow Lib "user32" _
            (ByVal hwnd As Long, _
            ByVal wCmd As Long) As Long

Private Declare Function LockWindowUpdate Lib "user32" _
            (ByVal hwndLock As Long) As Long

Private Declare Function GetDesktopWindow Lib "user32" () As Long

Private Declare Function DestroyWindow Lib "user32" _
            (ByVal hwnd As Long) As Long

Private Declare Function TerminateProcess Lib "kernel32" _
            (ByVal hProcess As Long, _
            ByVal uExitCode As Long) As Long

Private Declare Function GetCurrentProcess Lib "kernel32" () As Long

Private Declare Function Putfocus Lib "user32" _
            Alias "SetFocus" _
            (ByVal hwnd As Long) As Long

Const GW_HWNDNEXT =  2 
Dim mWnd As Long
Function InstanceToWnd(ByVal target_pid As Long) As Long
    Dim test_hwnd As Long, test_pid As Long, test_thread_id As Long
    'Find the first window
    test_hwnd = FindWindow(ByVal  0 &, ByVal  0 &)
    Do While test_hwnd <>  0 
        'Check if the window isn't a child
        If GetParent(test_hwnd) =  0  Then
            'Get the window's thread
            test_thread_id = GetWindowThreadProcessId(test_hwnd, _
            test_pid)
            If test_pid = target_pid Then
                InstanceToWnd = test_hwnd
                Exit Do
            End If
        End If
        'retrieve the next window
        test_hwnd = GetWindow(test_hwnd, GW_HWNDNEXT)
    Loop
End Function

Private Sub Form_Load()
    Dim Pid As Long
    'Lock the window update
    LockWindowUpdate GetDesktopWindow
    'Execute notepad.Exe
    Pid = Shell("c:\winnt\notepad.exe", vbNormalFocus)
    If Pid =  0  Then MsgBox "Error starting the app"
    'retrieve the handle of the window
    mWnd = InstanceToWnd(Pid)
    'Set the notepad's parent
    SetParent mWnd, Me.hwnd
    'Put the focus on notepad
    Putfocus mWnd
    'Unlock windowupdate
    LockWindowUpdate False
End Sub

Private Sub Form_Unload(Cancel As Integer)
    'Unload notepad
    'DestroyWindow mWnd
    'End this program
    'TerminateProcess GetCurrentProcess, 0
End Sub



Код робочий пробовал но мне не надо с запуском тоисть без
Private Sub Form_Load()

А вот как прописать в Private Sub Form_Unload(Cancel As Integer)
чтоб оно закрывалось зная название окна и Hwnd


этот код для ввода нотепада в твою форму как дочерную

вроде не то что ты хотел
...
Рейтинг: 0 / 0
Закрыть окно
    #33727708
Barsss
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
TIKO


этот код для ввода нотепада в твою форму как дочерную

вроде не то что ты хотел

Не то. А если не вводить в форму? Неполучится?
...
Рейтинг: 0 / 0
Закрыть окно
    #33727750
TIKO
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
можно но по процессу т.е. само ехе закрыть а не окно по наименованию
хотя я сам не работал с этими функциями, попробуй.
...
Рейтинг: 0 / 0
Закрыть окно
    #33727773
Barsss
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
В том то и дело что .exe закрыть нельзя надо именно окно по названию.
...
Рейтинг: 0 / 0
Закрыть окно
    #33727790
Melkiades
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
BarsssВ том то и дело что .exe закрыть нельзя надо именно окно по названию.
Так. Это ваши слова? Barsss Как закрыть окно, полностю закрыть чтоб и процесс закрылся, зная название окна.
У вас что, приложение порождает несколько процессов, и нужно закрыть один из них?
Если нет - то я не понимаю, что можно закрывать, а что нельзя.
...
Рейтинг: 0 / 0
Закрыть окно
    #33727816
TIKO
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
может проанализировать сам файл на открыт или закрыт
если известен путь файл
...
Рейтинг: 0 / 0
Закрыть окно
    #33727833
Barsss
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Закрыть надо окно Интеренет Еxplorera. Но не все а только некоторые, с определёнными названиями.
...
Рейтинг: 0 / 0
Закрыть окно
    #33727913
TIKO
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
используй через референс InternetExplorer.Application
для анализа и последующих действий
...
Рейтинг: 0 / 0
Закрыть окно
    #33728011
Ashton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Странно, что у вас не работает FindWindow с PostMessage.

BarsssЗакрыть надо окно Интеренет Еxplorera. Но не все а только некоторые, с определёнными названиями.
1. Воспользоваться функций "FindWindowLike", описанной здесь , чтобы найти все дескрипторы окон, содержащие определенное название и с помощью, все той же функции "PostMessage", закрыть их.

2.

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
    Dim objIE As SHDocVw.InternetExplorer
    Dim objCurrent As SHDocVw.InternetExplorer
    Dim objWindows As SHDocVw.ShellWindows
    Dim strFullName As String
    
    Set objWindows = CreateObject("Shell.Application").Windows
    
    For Each objIE In objWindows
        strFullName = objIE.FullName
        If Right$(strFullName,  12 ) = "IEXPLORE.EXE" Then
            If InStr(LCase(objIE.LocationURL), "sql.ru") >  0  Then
                objIE.Quit
            End If
        End If
    Next objIE

У меня работают оба варианта.
...
Рейтинг: 0 / 0
Закрыть окно
    #33728075
Ashton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Во втором варианте соответсвенно, вместо objIE.LocationURL - objIE.LocationName.
...
Рейтинг: 0 / 0
Закрыть окно
    #33728161
Barsss
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Вот так вот работает (Коректируйте под себя) Может кому пригодится.
Всем большое спасибо за помощь


Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
Dim WinWnd As Long
    Dim Ret As String
    Dim RetVal As Long
    Dim lpClassName As String
    'Ret = "Безымянный - Блокнот"  'InputBox("Введите точный заголовок окна:" & vbCrLf & _
            "Важно: должно быть точное соответствие")
    'Ищим окно
    Ret = "Fetchy - Search All Major Search Engines At Once And Win Tons Of Cash And Prizes! - Microsoft Internet Explorer"
    WinWnd = FindWindow(vbNullString, Ret)
    If WinWnd =  0  Then
        MsgBox "Окно не найдено ..."
        Exit Sub
    End If
    'Показываем найденное окно
    ShowWindow WinWnd, SW_SHOWNORMAL
    'Создаём буфер
    lpClassName = Space( 256 )
    'Получаем имя класса
    RetVal = GetClassName(WinWnd, lpClassName,  256 )
    'Показываем имя класса
    MsgBox "Имя класса : " & Left$(lpClassName, RetVal)
    'Посылаем сообщение закрытия окна
    PostMessage WinWnd, WM_CLOSE,  0 &,  0 &
...
Рейтинг: 0 / 0
Закрыть окно
    #33728168
Barsss
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Прошу прощения пропустил начало

Код: 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.
Private Declare Function FindWindow Lib "user32" _
            Alias "FindWindowA" _
            (ByVal lpClassName As String, _
            ByVal lpWindowName As String) As Long

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

Private Declare Function GetClassName Lib "user32" _
            Alias "GetClassNameA" _
            (ByVal hwnd As Long, _
            ByVal lpClassName As String, _
            ByVal nMaxCount As Long) As Long

Private Declare Function ShowWindow Lib "user32" _
            (ByVal hwnd As Long, _
            ByVal nCmdShow As Long) As Long

Const SW_SHOWNORMAL =  1 
Const WM_CLOSE = &H10
Const gcClassnameMSWord = "OpusApp"
Const gcClassnameMSExcel = "XLMAIN"
Const gcClassnameMSIExplorer = "IEFrame"
Const gcClassnameMSVBasic = "wndclass_desked_gsk"
Const gcClassnameNotePad = "Notepad"
Const gcClassnameMyVBApp = "ThunderForm"
...
Рейтинг: 0 / 0
Период между сообщениями больше года.
Закрыть окно
    #34547010
max_111
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
complite error:
invalid outside procedure

подсвечивает

"Fetchy - Search All Major Search Engines At Once And Win Tons Of Cash And Prizes! - Microsoft Internet Explorer"
...
Рейтинг: 0 / 0
23 сообщений из 23, страница 1 из 1
Форумы / Visual Basic [игнор отключен] [закрыт для гостей] / Закрыть окно
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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