Google Groups no longer supports new Usenet posts or subscriptions. Historical content remains viewable.
Dismiss

Поиск окна по заголовку

20 views
Skip to first unread message

Alex

unread,
Jun 21, 2000, 3:00:00 AM6/21/00
to
Hello, All
Вот пишу прогу для перехвата окна с сообщением о получении почты.
(ну хочу, чтобы приятный женский голос говорил что почта пришла, мечта такая) и
столкнулся с такой проблемой:
Private Sub findgotten()
For a = 1 To 1000000
Text1.Text = GetCaption(a)
DoEvents
Dim pos As Integer
searchtext = "You have received a new"
pos = Form1.Text1.SelStart
pos = InStr(pos + 2, Form1.Text1.Text, searchtext)
If pos = 0 Then
Form1.Text1.SelStart = 0
Form1.Text1.SelLength = 0
Else
Form1.Text1.SelStart = pos - 1
Form1.Text1.SelLength = Len(searchtext)
End If

searchtext = Form1.Text1.SelText
If searchtext <> "" Then
MsgBox Text1.Text
Exit Sub
End If
Next a

End Sub


--------------------------------------------------------
Этот код стоит у меня в таймере с интрвалом в 5 сек
Hапример , я ещу по строке "Form1", то находится окно "Project1- Microsoft
Visual Basic - Form1 - Design", но не находится "Form1"
То окно, которое я ищу,"You have received a new message", не находится вобще
Зато этот код работает прекрасно, но тут я ищу по полному заголовку:

For n = 1 To 20
zet = FindWindow(vbNullString, "You have " & n & " new messages in your Hotmail
Inbox. Click here to read these messages.")
z="d:\" & n & ".wav"
If zet <> 0 Then Call many(z)
Next n

Что делать, где проблема?

Sergey Merzlikin

unread,
Jun 23, 2000, 3:00:00 AM6/23/00
to
Здравствуйте!

Честно говоря не понял, зачем тут вообще нужны фокусы с текстбоксом, но
ошибка в том, что поиск подстроки производится со второго символа (pos
всегда 0):


> pos = InStr(pos + 2, Form1.Text1.Text, searchtext)

Если я правильно понял, функция GetCaption написана вами, и последовательно
перебирает все главные окна в системе (скорее всего, она состоит из вызова
API GetWindow и GetWindowText). Так вот, Microsoft не рекомендует такой
подход, поскольку за время перебора окон состав и иерархия окон в системе
может измениться, и результат будет неверным. Всегда надежный результат дает
применение функции EnumWindows, которая делает мгновенный снимок всех окон в
системе. Вот пример ее использования применительно к обсуждаемой задаче:

Declare Function EnumWindows Lib "user32" _
(ByVal lpEnumFunc As Long, lParam As Long) As Long
' Параметр передается по ссылке, поэтому через него можно возвращать hWnd

Declare Function GetWindowText Lib "user32" Alias "GetWindowTextA" _
(ByVal hwnd As Long, ByVal lpString As String, _
ByVal cch As Long) As Long
Dim SearchString as String

Private Function FindWindowByCaption(WCaption as String) as Long
' Возвращается hWnd или 0
SearchString = WCaption
EnumWindows AddressOf EnumWindowsProc, FindWindowByCaption
End Function

Private Function EnumWindowsProc(ByVal hWnd As Long, lParam As Long) As Long
Dim buf as String
buf = String$(255,0)
GetWindowText(hWnd, buf, 255)
' Так найдутся все окна, содержащие в заголовке указанную строку
If Instr(1, buf, SearchString) Then
' Если нужно, чтобы находились только окна, которые начинаются
' с заданной строки, то следует писать так:
'If Instr(1, buf, SearchString) = 1 Then
lParam = hWnd
Else
EnumWindowsProc = 1
End If

Для большей надежности рекомендуется дополнительно проверять также и класс
окна.

Сергей Мерзликин
http://smsoft.chat.ru/ru
sms...@chat.ru

"Alex" <alex_ak...@hotmail.com> wrote in message
news:961641593%alex_ak...@hotmail.com...

Alexander Trishin

unread,
Jun 23, 2000, 3:00:00 AM6/23/00
to
"Alex" <alex_ak...@hotmail.com> wrote in message
news:961641593%alex_ak...@hotmail.com...
> Hello, All
> Вот пишу прогу для перехвата окна с сообщением о получении почты.
> (ну хочу, чтобы приятный женский голос говорил что почта пришла, мечта
такая) и
> столкнулся с такой проблемой:
=== Cut ===
Это ж надо так извратиться... Может тебе лучше посмотреть API
EnumWindows/EnumChildWindows ?


0 new messages