FindWindow и Like...

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

FindWindow и Like...

Сообщение Nikolka » 12.05.2005 (Чт) 15:34

Основная суть проблемы: нужно чтобы FindWindow находил окна с примерным названием. Допустим есть окно "Блокнот - Безымянный". А нужно чтобы FindWindow нашёл все окна с названиями скажем "Блокнот*". Пробовал вводит вот так, через звёздочку, как в Like, но не выходит. Что делать? И как этом можно сделать побыстрее...

Amed
Алфизик
Алфизик
 
Сообщения: 5346
Зарегистрирован: 09.03.2003 (Вс) 9:26

Сообщение Amed » 12.05.2005 (Чт) 15:40

Пример подобный где-то видел... Сейчас поищу.
А ещё один способ есть - найти ВСЕ открытые окна и отсортировать те, в которых InStr(1,caption,"Блокнот")>0.

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

Сообщение GSerg » 12.05.2005 (Чт) 15:45

Код: Выделить всё
<EnumWindows>
  <LIKE pattern="Блокнот*" compareto="WM_GETTEXT" size="WM_GETTEXTLENGTH"/>
</EnumWindows>
Как только вы переберёте все варианты решения и не найдёте нужного, тут же обнаружится решение, простое и очевидное для всех, кроме вас

Nikolka
Продвинутый пользователь
Продвинутый пользователь
 
Сообщения: 174
Зарегистрирован: 01.01.2004 (Чт) 2:06

Сообщение Nikolka » 12.05.2005 (Чт) 15:47

Всё бы гуд, но этот способ не самый быстрый...
Но если другого ничё не будет, придётся довольствоваться.
Кстати, как это сделать - какая функция. Имеешь ввиду
FindWindow(vbNullString, "")?

Nikolka
Продвинутый пользователь
Продвинутый пользователь
 
Сообщения: 174
Зарегистрирован: 01.01.2004 (Чт) 2:06

Сообщение Nikolka » 12.05.2005 (Чт) 15:51

эээ. Это код для VB6? Я знаю что я полный лам, но... нельзя ли описать...

Amed
Алфизик
Алфизик
 
Сообщения: 5346
Зарегистрирован: 09.03.2003 (Вс) 9:26

Сообщение Amed » 12.05.2005 (Чт) 15:53

GSerg писал(а):
Код: Выделить всё
<EnumWindows>
  <LIKE pattern="Блокнот*" compareto="WM_GETTEXT" size="WM_GETTEXTLENGTH"/>
</EnumWindows>

:thumleft:

Вот пример для получения всех окон (hwnd+заголовок):
Код: Выделить всё
'Add this code to a form
Private Sub Form_Load()
    'KPD-Team 2000
    'URL: http://www.allapi.net/
    'E-Mail: KPDTeam@Allapi.net
    'Set the form's graphics mode to persistent
    Me.AutoRedraw = True
    'call the Enumwindows-function
    EnumWindows AddressOf EnumWindowsProc, ByVal 0&
End Sub
'Add this code to a module
Declare Function EnumWindows Lib "user32" (ByVal lpEnumFunc As Long, ByVal lParam As Long) As Boolean
Declare Function GetWindowText Lib "user32" Alias "GetWindowTextA" (ByVal hwnd As Long, ByVal lpString As String, ByVal cch As Long) As Long
Declare Function GetWindowTextLength Lib "user32" Alias "GetWindowTextLengthA" (ByVal hwnd As Long) As Long
Public Function EnumWindowsProc(ByVal hwnd As Long, ByVal lParam As Long) As Boolean
    Dim sSave As String, Ret As Long
    Ret = GetWindowTextLength(hwnd)
    sSave = Space(Ret)
    GetWindowText hwnd, sSave, Ret + 1
    Form1.Print Str$(hwnd) + " " + sSave
    'continue enumeration
    EnumWindowsProc = True
End Function


Разберись с ним, ничего сложного быть не должно.
Потом все полученные заголовки пропусти сквозь Like.

Nikolka
Продвинутый пользователь
Продвинутый пользователь
 
Сообщения: 174
Зарегистрирован: 01.01.2004 (Чт) 2:06

Сообщение Nikolka » 12.05.2005 (Чт) 15:57

Пасиба. А насколько это медленнее FindWindow?

Amed
Алфизик
Алфизик
 
Сообщения: 5346
Зарегистрирован: 09.03.2003 (Вс) 9:26

Сообщение Amed » 12.05.2005 (Чт) 16:03

Через FindWindow такое не провернуть. К сожалению. Только вот так.

uhm
Продвинутый гуру
Продвинутый гуру
Аватара пользователя
 
Сообщения: 1597
Зарегистрирован: 02.12.2004 (Чт) 15:21

Сообщение uhm » 14.05.2005 (Сб) 11:20

На всякий случай, хоть про это и не спрашивалось - FindWindow может искать не только по заголовку окна, но и по классу, так что можно определить класс и искать по нему, не обращая внимания на заголовок.

Nikolka
Продвинутый пользователь
Продвинутый пользователь
 
Сообщения: 174
Зарегистрирован: 01.01.2004 (Чт) 2:06

Сообщение Nikolka » 19.05.2005 (Чт) 16:29

Всем пасиба. Функция работает быстро и замечательно. Она уже встроена в программу и хорошо справляется с целью.


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

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

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 141

    TopList