Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Visual Basic [игнор отключен] [закрыт для гостей] / Закрыть окно / 23 сообщений из 23, страница 1 из 1
15.05.2006, 12:32
    #33726713
Barsss
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Закрыть окно
Искал здесь но чтото не нашел конкретного ответа. Как закрыть окно, полностю закрыть чтоб и процес закрылся, зная название окна.
Помогите разобратся.
...
Рейтинг: 0 / 0
15.05.2006, 12:38
    #33726745
Melkiades
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Закрыть окно
Например, так .
...
Рейтинг: 0 / 0
15.05.2006, 14:14
    #33727176
Barsss
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Закрыть окно
Только эти коды действительно не работают, есть какие то соображения??
По крайней мере у меня.
...
Рейтинг: 0 / 0
15.05.2006, 14:20
    #33727202
Melkiades
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Закрыть окно
Какие коды? В смысле - программмный код? Так приведите его.
...
Рейтинг: 0 / 0
15.05.2006, 14:24
    #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
15.05.2006, 14:29
    #33727248
Melkiades
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Закрыть окно
Вы что, издеваетесь? Только что проверил этот код - он полностью работает.
Как и где вы его запускаете? Вы уверены, что посылаете в FindWindow привильный заголовок окна?
...
Рейтинг: 0 / 0
15.05.2006, 14:40
    #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
15.05.2006, 14:53
    #33727408
Melkiades
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Закрыть окно
Странно.
В таком слукае после того как нашли нэндлер окна попробуйте использовать функции GetWindowThreadProcessId и TerminateProcess.
...
Рейтинг: 0 / 0
15.05.2006, 15:03
    #33727482
TIKO
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Закрыть окно
попробуй убрать .txt
A - Блокнот
...
Рейтинг: 0 / 0
15.05.2006, 15:36
    #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
15.05.2006, 15:42
    #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
15.05.2006, 15:45
    #33727708
Barsss
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Закрыть окно
TIKO


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

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

Не то. А если не вводить в форму? Неполучится?
...
Рейтинг: 0 / 0
15.05.2006, 15:53
    #33727750
TIKO
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Закрыть окно
можно но по процессу т.е. само ехе закрыть а не окно по наименованию
хотя я сам не работал с этими функциями, попробуй.
...
Рейтинг: 0 / 0
15.05.2006, 15:57
    #33727773
Barsss
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Закрыть окно
В том то и дело что .exe закрыть нельзя надо именно окно по названию.
...
Рейтинг: 0 / 0
15.05.2006, 16:01
    #33727790
Melkiades
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Закрыть окно
BarsssВ том то и дело что .exe закрыть нельзя надо именно окно по названию.
Так. Это ваши слова? Barsss Как закрыть окно, полностю закрыть чтоб и процесс закрылся, зная название окна.
У вас что, приложение порождает несколько процессов, и нужно закрыть один из них?
Если нет - то я не понимаю, что можно закрывать, а что нельзя.
...
Рейтинг: 0 / 0
15.05.2006, 16:08
    #33727816
TIKO
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Закрыть окно
может проанализировать сам файл на открыт или закрыт
если известен путь файл
...
Рейтинг: 0 / 0
15.05.2006, 16:12
    #33727833
Barsss
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Закрыть окно
Закрыть надо окно Интеренет Еxplorera. Но не все а только некоторые, с определёнными названиями.
...
Рейтинг: 0 / 0
15.05.2006, 16:33
    #33727913
TIKO
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Закрыть окно
используй через референс InternetExplorer.Application
для анализа и последующих действий
...
Рейтинг: 0 / 0
15.05.2006, 16:57
    #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
15.05.2006, 17:12
    #33728075
Ashton
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Закрыть окно
Во втором варианте соответсвенно, вместо objIE.LocationURL - objIE.LocationName.
...
Рейтинг: 0 / 0
15.05.2006, 17:36
    #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
15.05.2006, 17:39
    #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
Период между сообщениями больше года.
23.05.2007, 22:05
    #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
Форумы / Visual Basic [игнор отключен] [закрыт для гостей] / Закрыть окно / 23 сообщений из 23, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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