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
Что делать, где проблема?
Честно говоря не понял, зачем тут вообще нужны фокусы с текстбоксом, но
ошибка в том, что поиск подстроки производится со второго символа (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...