Закрыть окно Windows Explorer-а

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

Закрыть окно Windows Explorer-а

Сообщение caa2000 » 14.11.2015 (Сб) 0:01

Здравствуйте всем.
Есть програмка,которая открывает несколько окон Windows Explorer-а.
Нужно при выходе (закрытии) программы закрыть все окна,которые она открывала.
Есть код от Майкрософта на примере Калькулятора
Код: Выделить всё
Option Explicit

      Private Declare Function WaitForSingleObject Lib "kernel32" _
         (ByVal hHandle As Long, _
         ByVal dwMilliseconds As Long) As Long

      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, _
         ByVal lParam As Long) As Long

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

      Private Declare Function OpenProcess Lib "kernel32" _
         (ByVal dwDesiredAccess As Long, _
         ByVal bInheritHandle As Long, _
         ByVal dwProcessId As Long) As Long
     
      Private Declare Function GetWindowThreadProcessId Lib "user32" _
         (ByVal hwnd As Long, _
         lpdwProcessId As Long) As Long

      'Constants that are used by the API
      Const WM_CLOSE = &H10
      Const INFINITE = &HFFFFFFFF
      Const SYNCHRONIZE = &H100000

      Private Sub Form_Load()
         Command1.Caption = "Start the Calculator"
         Command2.Caption = "Close the Calculator"
      End Sub

      Private Sub Command1_Click()
      'Starts Windows Calculator
         Shell "calc.exe", vbNormalNoFocus
      End Sub

      Private Sub Command2_Click()
      'Closes Windows Calculator
         Dim hWindow As Long
         Dim hThread As Long
         Dim hProcess As Long
         Dim lProcessId As Long
         Dim lngResult As Long
         Dim lngReturnValue As Long

         hWindow = FindWindow(vbNullString, "Calculator")
         hThread = GetWindowThreadProcessId(hWindow, lProcessId)
         hProcess = OpenProcess(SYNCHRONIZE, 0&, lProcessId)
         lngReturnValue = PostMessage(hWindow, WM_CLOSE, 0&, 0&)
         lngResult = WaitForSingleObject(hProcess, INFINITE)

         'Does the handle still exist?
         DoEvents
         hWindow = FindWindow(vbNullString, "Calculator")
         If IsWindow(hWindow) = 1 Then
            'The handle still exists. Use the TerminateProcess function
            'to close all related processes to this handle. See the
            'article for more information.
            MsgBox "Handle still exists."
         Else
            'Handle does not exist.
            MsgBox "All Program Instances Closed."
         End If
      End Sub

Только окно Explorer-а (Computer,Lybrary,Documents и т.д.) не имеют названия (Caption).
Как их найти ?
Windows 7. Я не помню, в ХР тоже никак не называются ?
Последний раз редактировалось caa2000 14.11.2015 (Сб) 0:06, всего редактировалось 1 раз.
Имеющий уши, да услышит.. (с) Новый Завет От Матфея святое благовествование

Хакер
Телепат
Телепат
Аватара пользователя
 
Сообщения: 16478
Зарегистрирован: 13.11.2005 (Вс) 2:43
Откуда: Казахстан, Петропавловск

Re: Закрыть окно Windows Explorer-а

Сообщение Хакер » 14.11.2015 (Сб) 0:04

По классу найти.

Только это какой-то совершенно ущербный подход. Как отличить несколько окон, которые понаоткрывала программа, от окон, которые были открыты пользователем и которые ему нужны? Нужно совершенно другой подход использовать.
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

caa2000
Обычный пользователь
Обычный пользователь
 
Сообщения: 87
Зарегистрирован: 14.05.2009 (Чт) 4:50

Re: Закрыть окно Windows Explorer-а

Сообщение caa2000 » 14.11.2015 (Сб) 0:22

А не подскажете как найти по классу , хотя бы ссылку.
Имеющий уши, да услышит.. (с) Новый Завет От Матфея святое благовествование

Хакер
Телепат
Телепат
Аватара пользователя
 
Сообщения: 16478
Зарегистрирован: 13.11.2005 (Вс) 2:43
Откуда: Казахстан, Петропавловск

Re: Закрыть окно Windows Explorer-а

Сообщение Хакер » 14.11.2015 (Сб) 0:26

caa2000 писал(а):А не подскажете как найти по классу , хотя бы ссылку.

Не могу сказать ничего умнее, чем «так же, как и по имени».
В чём вопрос-то?

Ссылка.
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

Qwertiy
Доктор VB наук
Доктор VB наук
 
Сообщения: 2753
Зарегистрирован: 26.06.2011 (Вс) 21:26

Сообщение Qwertiy » 14.11.2015 (Сб) 23:22

Хакер писал(а):По классу найти.

Эм.. Вроде у всех окон проводника будет один и тот же класс - что именно ты предложил найти?

Хакер
Телепат
Телепат
Аватара пользователя
 
Сообщения: 16478
Зарегистрирован: 13.11.2005 (Вс) 2:43
Откуда: Казахстан, Петропавловск

Re: Закрыть окно Windows Explorer-а

Сообщение Хакер » 15.11.2015 (Вс) 1:47

Qwertiy писал(а):Эм.. Вроде у всех окон проводника будет один и тот же класс - что именно ты предложил найти?

То же, что собирался автор? Автор пользуется FindWindow.

Я написал выше, что подход с FindWindow найдёт все подряд окна проводника, и как подход — несостоятельный и должен быть выброшен. Зачем спрашивать, что я предлагал найти?
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

Qwertiy
Доктор VB наук
Доктор VB наук
 
Сообщения: 2753
Зарегистрирован: 26.06.2011 (Вс) 21:26

Сообщение Qwertiy » 15.11.2015 (Вс) 15:21

Хакер писал(а):То же, что собирался автор? Автор пользуется FindWindow.

Ну по названию-то найдутся все окна Проводника, в которых открыта соответствующая папка.
А по имени класса найдутся вообще все окна проводника. Это вроде вообще не то, что надо?

Хакер писал(а):Зачем спрашивать, что я предлагал найти?

Ну я подумал, вдруг ты предлагаешь найти какое-то окно внутри окна Проводника, а не само top-level окно. Это могло бы иметь какой-то смысл.
Кстати, я как-то пытался у него адресную строку найти, но оказалось, что она создаётся только в момент перехода в режим редактирования адреса. Это я про текстовое поле в Win7.


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

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

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

    TopList