Форум программистов «Весельчак У»
  *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

  • Рекомендуем проверить настройки временной зоны в вашем профиле (страница "Внешний вид форума", пункт "Часовой пояс:").
  • У нас больше нет рассылок. Если вам приходят письма от наших бывших рассылок mail.ru и subscribe.ru, то знайте, что это не мы рассылаем.
   Начало  
Наши сайты
Помощь Поиск Календарь Почта Войти Регистрация  
 
Страниц: [1]   Вниз
  Печать  
Автор Тема: hwnd окна  (Прочитано 11477 раз)
0 Пользователей и 1 Гость смотрят эту тему.
BelowZro
Интересующийся

ru
Offline Offline

« : 19-06-2011 10:15 » 

подскажите пожалуйста код, находящий hwnd чужого окна по фрагменту имени. как образец есть код, закрывающий окно по фраменту имени, но не мойму, где в коде нахождение hwnd
форма
Код:
Private Sub Command1_Click()
    KillProga Text1.Text
End Sub
модуль
Код:
Option Explicit

Public TargetName As String
Public TargetHwnd As Long

Public Const GWL_STYLE = -16
Public Const WS_DISABLED = &H8000000
Public Const WS_CANCELMODE = &H1F
Public Const WM_CLOSE = &H10


Public Declare Function EnumWindows Lib "user32" (ByVal lpEnumFunc As Long, ByVal lParam As Long) As Long
Declare Function GetWindowText Lib "user32" Alias _
    "GetWindowTextA" (ByVal hWnd As Long, ByVal lpString _
    As String, ByVal cch As Long) As Long
Declare Function IsWindow Lib "user32" (ByVal hWnd As Long) _
    As Long
Declare Function GetWindowLong Lib "user32" Alias _
    "GetWindowLongA" (ByVal hWnd As Long, _
    ByVal nIndex As Long) As Long
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

Sub KillProga(proga As String)
    Do
        TargetName = proga
        TargetHwnd = 0
        ' Examine the window names.
        EnumWindows AddressOf WindowEnumerator, 0
        ' See if we got an hwnd.
        If TargetHwnd = 0 Then
            Exit Do
        Else
            EndTask (TargetHwnd)
        End If
    Loop
End Sub

' Return False to stop the enumeration.
Public Function WindowEnumerator(ByVal app_hwnd As Long, _
    ByVal lParam As Long) As Long
Dim buf As String * 256
Dim Title As String
Dim length As Long

    ' Get the window's title.
    length = GetWindowText(app_hwnd, buf, Len(buf))
    Title = Left$(buf, length)

    ' See if the title contains the target.
    If InStr(Title, TargetName) > 0 Then
        ' Save the hwnd and end the enumeration.
        TargetHwnd = app_hwnd
        WindowEnumerator = False
    Else
        ' Continue the enumeration.
        WindowEnumerator = True
    End If
End Function

Function EndTask(TargetHwnd As Long) As Long
   
    Dim rc As Integer
    Dim ReturnVal As Integer
'    If TargetHwnd = Form1.hwnd Or GetWindow(TargetHwnd, _
'        GW_OWNER) = Form1.hwnd Then
'        End
'    End If
    If IsWindow(TargetHwnd) = False Then
        GoTo EndTaskFail
    End If
    If (GetWindowLong(TargetHwnd, GWL_STYLE) _
        And WS_DISABLED) Then
        GoTo EndTaskSucceed
    End If
   
    'Close the window
    If IsWindow(TargetHwnd) Then
        If Not (GetWindowLong(TargetHwnd, GWL_STYLE) _
        And WS_DISABLED) Then
        'rc = PostMessage(TargetHwnd, WS_CANCELMODE, 0, 0&)
        'rc = PostMessage(TargetHwnd, WM_CLOSE, 0, 0&)
         DoEvents
        End If
    End If
    GoTo EndTaskSucceed
   
EndTaskFail:
    ReturnVal = False
    GoTo EndTaskEndSub
EndTaskSucceed:
    ReturnVal = True
EndTaskEndSub:
    EndTask = ReturnVal
End Function

Записан
Вад
Команда клуба

ru
Offline Offline
Пол: Мужской

« Ответ #1 : 19-06-2011 11:00 » 

EnumWindows перебирает окна, вызывая для каждого из них функцию WindowEnumerator и передавая ей хэндл данного окна. WindowEnumerator сравнивает заголовок окна с искомым, и если окно подходит, сохраняет его хэндл и завершает перечисление (возвращая False). Вообще, комментарии там вполне адекватные - не понимаю, в чём сложность.
Записан
BelowZro
Интересующийся

ru
Offline Offline

« Ответ #2 : 19-06-2011 11:09 » 

Цитата
сохраняет его хэндл
в какой переменной сохранняет? как его получить? просто нуно потом работать с полученным хендлом. я думал, что TargetHwnd - полученный хендл, но он равен 0
Записан
Вад
Команда клуба

ru
Offline Offline
Пол: Мужской

« Ответ #3 : 19-06-2011 12:13 » 

Ну, судя по коду, в TargetHwnd и сохраняет. Если там ничего нет - значит, подходящего окна не нашлось. Приведённый код ведь для той задачи (закрытие окон) работает?
Записан
BelowZro
Интересующийся

ru
Offline Offline

« Ответ #4 : 19-06-2011 12:43 » 

код работает, но я никак не могу посмотреть, какой хендл сохраняется в переменной. text1.text = TargetHwnd не помогает...
Записан
Ципихович Эндрю
Помогающий

ru
Offline Offline

« Ответ #5 : 30-06-2011 06:36 » 

не пойму, здесь
KillProga
ошибки нет, разве не Call??
а здесь: TargetHwnd = 0 зачем так??
Записан
baldr
Команда клуба

cy
Offline Offline
Пол: Мужской
Дорогие россияне


WWW
« Ответ #6 : 30-06-2011 06:47 » 

Ципихович Эндрю, говорили же тебе - почитай описание языка, который используешь!
http://msdn.microsoft.com/en-us/library/831f9wka%28v=vs.80%29.aspx
Цитата
The use of the Call keyword is optional but not recommended.

а здесь: TargetHwnd = 0 зачем так??

Переменная TargetHwnd меняется в вызываемой функции WindowEnumerator(). Присваивание нуля - обнуление, поскольку используется глобальная переменная в контексте функции и функция могла быть вызвана до этого. В этом случае переменная TargetHwnd будет иметь предыдущее значение.
« Последнее редактирование: 30-06-2011 06:49 от baldr » Записан

Приличный компьютер всегда будет стоить дороже 1000 долларов, потому что 500 долларов - это не вполне прилично
Ципихович Эндрю
Помогающий

ru
Offline Offline

« Ответ #7 : 30-06-2011 06:52 » 

Использование вызова ключевое слово является необязательным, но не рекомендуется.
то есть он хотел сказать
Call KillProga
Не понял?
Шикарно, назвал бы ещё
CallProga
никто ж не запрещает, вот зачем форумы нужны

Добавлено через 9 часов, 33 минуты и 36 секунд:
разобрался, понял о чём автор спрашивает
добавил в коде автора:  Selection.TypeText Text:=Title & " - " & Length & Chr(13)
Почему в списке окон:
Default IME - 11
Default IME - 11
Default IME - 11
Default IME - 11
Default IME - 11
Default IME - 11
Default IME - 11
Повторения
Я понимаю, что можно спрограммить, чтобы в список и на лист бумаги они не попадали, но сам факт
Почему повторы??
« Последнее редактирование: 30-06-2011 16:26 от Ципихович Эндрю » Записан
Страниц: [1]   Вверх
  Печать  
 

Powered by SMF 1.1.21 | SMF © 2015, Simple Machines