Список всек открытых окон в панели задач (не всех процессов)

Программирование на Visual Basic, главный форум. Обсуждение тем программирования на VB 1—6.
Даже если вы плохо разбираетесь в VB и программировании вообще — тут вам помогут. В разумных пределах, конечно.
Правила форума
Темы, в которых будет сначала написано «что нужно сделать», а затем просьба «помогите», будут закрыты.
Читайте требования к создаваемым темам.
XairOn
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 324
Зарегистрирован: 19.07.2004 (Пн) 20:20
Откуда: Irkutsk region

Список всек открытых окон в панели задач (не всех процессов)

Сообщение XairOn » 25.09.2004 (Сб) 22:56

Возникла проблема с получением списка открытых окон. Вобщем мне нужно в ListBox вывести весь список открытых окон, но не

список задач, а только тех программ и окон, которые находятся в "панели задач". Как это сделать?

tyomitch
Пользователь #1352
Пользователь #1352
Аватара пользователя
 
Сообщения: 12822
Зарегистрирован: 20.10.2002 (Вс) 17:02
Откуда: חיפה

Сообщение tyomitch » 25.09.2004 (Сб) 23:07

Примеры использования шелл-хука: http://vbrussian.com/Controls.asp?ID=58 (от Оловянникова), http://www.codeguru.com/forum/showthrea ... did=256230
Тебе же, похоже, надо просто перечислить все окна (EnumWindows) и выбрать те, у который установлен расширенный стиль WS_EX_APPWINDOW
Изображение

XairOn
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 324
Зарегистрирован: 19.07.2004 (Пн) 20:20
Откуда: Irkutsk region

Сообщение XairOn » 25.09.2004 (Сб) 23:41

Ааа...ммм... простите-извините, но я ничего не понял... если не трудно, можно поподробнее как мне список получить?!

tyomitch
Пользователь #1352
Пользователь #1352
Аватара пользователя
 
Сообщения: 12822
Зарегистрирован: 20.10.2002 (Вс) 17:02
Откуда: חיפה

Сообщение tyomitch » 26.09.2004 (Вс) 0:04

Форма с листбоксом:
Код: Выделить всё
Option Explicit

Private Sub Form_Load()
GetAllWindows
End Sub


Модуль:
Код: Выделить всё
Option Explicit
Private Declare Function GetWindowLong Lib "user32" Alias "GetWindowLongA" (ByVal hWnd As Long, ByVal nIndex As Long) As Long
Private Declare Function GetWindowText Lib "user32" Alias "GetWindowTextA" (ByVal hWnd As Long, ByVal lpString As String, ByVal cch As Long) As Long
Private Declare Function EnumWindows Lib "user32" (ByVal lpEnumFunc As Long, ByVal lParam As Long) As Long
Private Declare Function IsWindowVisible Lib "user32" (ByVal hWnd As Long) As Long
Private Const GWL_STYLE = -16&
Private Const GWL_EXSTYLE = -20&
Private Const WS_EX_APPWINDOW = &H40000
Private Const WS_NOT_OVERLAPPED = &HC0000000
Private Const WS_BORDER = &H800000

Public Sub GetAllWindows()
EnumWindows AddressOf EnumWindowsProc, 0
End Sub

Private Function EnumWindowsProc(ByVal hWnd As Long, ByVal lParam As Long) As Long
Dim Caption As String * 256
If IsWindowVisible(hWnd) Then
    If (GetWindowLong(hWnd, GWL_EXSTYLE) And WS_EX_APPWINDOW) Or _
        (((GetWindowLong(hWnd, GWL_STYLE) And WS_NOT_OVERLAPPED) = 0) And _
        (GetWindowLong(hWnd, GWL_STYLE) And WS_BORDER)) Then
        GetWindowText hWnd, Caption, 256
        Form1.List1.AddItem Caption
    End If
End If
EnumWindowsProc = 1
End Function


Чтобы динамически обновлять окно при добавлении/убавлении/переименовании окон, ставь шелл-хук, как в примерах по ссылкам.
Изображение

XairOn
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 324
Зарегистрирован: 19.07.2004 (Пн) 20:20
Откуда: Irkutsk region

Сообщение XairOn » 26.09.2004 (Вс) 12:15

Спасибо большое, всё вроде работает, но... когда открыта какая-нибудь папка (или несколько папок), программа почему-то в листбокс вставляет пустую строку в произвольном месте. Как это этого избавиться?

XairOn
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 324
Зарегистрирован: 19.07.2004 (Пн) 20:20
Откуда: Irkutsk region

Сообщение XairOn » 26.09.2004 (Вс) 12:27

Небольшая поправка, пустая строка появляется, когда в трее какая-нибудь программка сидит (хотя не всегда), вобщем, етут

логика вообще непонятная, например когда у меня flesh get в трей свернут, пустая строка появляется, но если там аська

например сидит или dialer всё нормально, стоит появиться там flash get'у, как начинаются глюки. Можно ли как-нибудь решить

эту проблему???

XairOn
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 324
Зарегистрирован: 19.07.2004 (Пн) 20:20
Откуда: Irkutsk region

Сообщение XairOn » 26.09.2004 (Вс) 14:50

Что-то вообще я не понял, метод этот, по крайней мере у меня вообще хреново работает, некоторые программы не ищутся (особенно

если они свёрнуты), они почти все не ищутся :-( . Это разве нормально?

GSerg
Шаман
Шаман
 
Сообщения: 14286
Зарегистрирован: 14.12.2002 (Сб) 5:25
Откуда: Магадан

Сообщение GSerg » 26.09.2004 (Вс) 14:55

Странно всё это :)
Таксбар - это, в конечном итоге, ToolbarWindow32. Я пытался ему слать всякие рульные сообщения TB, но ничего так и не добился. Такое ощущение, что он их перехватывает и в defwindowproc не передаёт :?
Во всяком случае, есть сообщение TB_GETBUTTONTEXT. Ему нуно указать ID. ID можно получить, зная index, через TB_GETBUTTON. Но GETBUTTON всегда возвращает успех, хотя все значения структуры заполняет нулями. Так что не получается никак узнать этот самый TEXT :)
Как только вы переберёте все варианты решения и не найдёте нужного, тут же обнаружится решение, простое и очевидное для всех, кроме вас


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

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

Сейчас этот форум просматривают: С.Т., Yandex-бот и гости: 3

    TopList