Хитрости с MDI формами

Программирование на Visual Basic, главный форум. Обсуждение тем программирования на VB 1—6.
Даже если вы плохо разбираетесь в VB и программировании вообще — тут вам помогут. В разумных пределах, конечно.
Правила форума
Темы, в которых будет сначала написано «что нужно сделать», а затем просьба «помогите», будут закрыты.
Читайте требования к создаваемым темам.
claymen
Продвинутый пользователь
Продвинутый пользователь
Аватара пользователя
 
Сообщения: 159
Зарегистрирован: 14.04.2006 (Пт) 16:07
Откуда: КЫРГЫЗСТАН г.Бишкек

Хитрости с MDI формами

Сообщение claymen » 03.12.2006 (Вс) 16:09

На работе мне поставили следующую задачу:
Есть некое програмное обеспечение (НакаВыкуси Software).
Но в этой программе отсутствует защита от доступа (по распределению). И мне нужно содать стороннюю программу, которая бы и реализовала эту защиту. Т.е.:
Пользователь запускает програму НакаВыкуси и шляется там по всем пунктам меню (а для некоторых "чайников" такой софт-серфинг ОЧЕНЬ опасен). Моя задача состоит в том, чтобы не давать пользователю заходить в некоторые пункты меню.
Я решил реализовать данное действие следующим образом:
Код: Выделить всё
        'Попытаюсь поймать handle окна [УСТАНОВКИ] как только
         чайник попытается войти в меню {Файл}{Установки}
        target_hwnd = FindWindow(vbNullString, "Установки")
        If target_hwnd > 0 Then
            PostMessage target_hwnd, WM_CLOSE, 0&, 0&
            MsgBox "Выкуси-ка!", vbCritical, "ВНИМАНИЕ!"
        End If

Ну вродебы сработало: чайник увидел вместо окна "Установки" то, что я ему дам.

Да хорошо.
Но такой трюк несрабатывает с MDI-формами программы, типа:
следующее окно выдает свой хэндл по его названию

#НакаВыкуси------------------------------[X]

а вот его дочернее (MDI) выдает только так

#НакаВыкуси - [Установки]-------------[X]

а вот так уже нет

#НакаВыкуси------------------------------[X]
#Установки---------------------------------[X]

Помогите plz.
и начинали мы все чайниками, но потом...

keks-n
Доктор VB наук
Доктор VB наук
Аватара пользователя
 
Сообщения: 2509
Зарегистрирован: 19.09.2005 (Пн) 17:17
Откуда: г. Москва

Сообщение keks-n » 03.12.2006 (Вс) 16:38

Хук на все оконные сообщение на главный тред той аппликухи повесить надо.
Изображение

claymen
Продвинутый пользователь
Продвинутый пользователь
Аватара пользователя
 
Сообщения: 159
Зарегистрирован: 14.04.2006 (Пт) 16:07
Откуда: КЫРГЫЗСТАН г.Бишкек

Сообщение claymen » 03.12.2006 (Вс) 16:57

keks-n
Извини, но ты мог бы по-понятнее (без слэнга)?
и начинали мы все чайниками, но потом...

keks-n
Доктор VB наук
Доктор VB наук
Аватара пользователя
 
Сообщения: 2509
Зарегистрирован: 19.09.2005 (Пн) 17:17
Откуда: г. Москва

Сообщение keks-n » 03.12.2006 (Вс) 17:33

См. пример с часами от tyomitch.
Изображение

claymen
Продвинутый пользователь
Продвинутый пользователь
Аватара пользователя
 
Сообщения: 159
Зарегистрирован: 14.04.2006 (Пт) 16:07
Откуда: КЫРГЫЗСТАН г.Бишкек

Сообщение claymen » 03.12.2006 (Вс) 17:37

keks-n
а не подскажешь ссылочку, а?
и начинали мы все чайниками, но потом...

keks-n
Доктор VB наук
Доктор VB наук
Аватара пользователя
 
Сообщения: 2509
Зарегистрирован: 19.09.2005 (Пн) 17:17
Откуда: г. Москва

Сообщение keks-n » 03.12.2006 (Вс) 18:16

http://bbs.vbstreets.ru/viewtopic.php?t=10245

В принципе, надо ловить нажатие на менюху.
Изображение

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

Сообщение tyomitch » 04.12.2006 (Пн) 7:16

Поиск окна по подстроке заголовка: http://groups.google.com/group/fido7.ru ... d7af76965e
Изображение

keks-n
Доктор VB наук
Доктор VB наук
Аватара пользователя
 
Сообщения: 2509
Зарегистрирован: 19.09.2005 (Пн) 17:17
Откуда: г. Москва

Сообщение keks-n » 04.12.2006 (Пн) 13:58

tyomitch
Таки перехват сообщений даёт больше возможностей по контролю.
Изображение

claymen
Продвинутый пользователь
Продвинутый пользователь
Аватара пользователя
 
Сообщения: 159
Зарегистрирован: 14.04.2006 (Пт) 16:07
Откуда: КЫРГЫЗСТАН г.Бишкек

Сообщение claymen » 04.12.2006 (Пн) 14:05

tyomitch
я смотрел эту ссылку, но тамошний пример не работает!
Все время вылезают ошибки.
и начинали мы все чайниками, но потом...

claymen
Продвинутый пользователь
Продвинутый пользователь
Аватара пользователя
 
Сообщения: 159
Зарегистрирован: 14.04.2006 (Пт) 16:07
Откуда: КЫРГЫЗСТАН г.Бишкек

Сообщение claymen » 04.12.2006 (Пн) 14:33

Код: Выделить всё
Declare Function EnumChildWindows Lib "user32" Alias "EnumChildWindows" (ByVal hWndParent As Long, ByVal lpEnumFunc As Long, ByVal lParam As Long) As Long

Я так понял, что эта функция возвращает handle дочернего окна главной программы. Если это так, то подскажите пожалуйсто, что означают следующие параметры:
hWndParent - это, как я понял handle главной программы, а вот что они означают: lpEnumFunc, lParam ???
и начинали мы все чайниками, но потом...

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

Сообщение Amed » 04.12.2006 (Пн) 14:47

· lpEnumFunc
Points to an application-defined callback function. For more information about the callback function, see the EnumChildProc callback function.

· lParam
Specifies a 32-bit, application-defined value to be passed to the callback function.

В api-guide есть прекрасный пример :)

Viper
Артефакт VBStreets
Артефакт VBStreets
Аватара пользователя
 
Сообщения: 4394
Зарегистрирован: 12.04.2005 (Вт) 17:50
Откуда: Н.Новгород

Сообщение Viper » 04.12.2006 (Пн) 14:49

нды... MSDN отменили? lpEnumFunc - указатель на callback-функцию, в которую будет передаваться инфа о перечисляемых дочерних окнах, а lParam - определяет дополнительные данные которые в эту функцию можно передать
Весь мир матрица, а мы в нем потоки байтов!

claymen
Продвинутый пользователь
Продвинутый пользователь
Аватара пользователя
 
Сообщения: 159
Зарегистрирован: 14.04.2006 (Пт) 16:07
Откуда: КЫРГЫЗСТАН г.Бишкек

Сообщение claymen » 04.12.2006 (Пн) 14:59

!Viper!
То, что вы заметили насчет MSDN - это зря.
Тоже самое я прочитал там.
Блин, но как мне это исспользовать?
Вот самый наипростейший пример:
Есть главная программа "MS Word" и дочернее окно "Реферат".
Так как мне найти handle окна Реферат, пока оно еще не развернуто во весь экран и не превратилось в окно "Реферат - MS Word" с помощью функции EnumChildWindows.

ЛЮДИ! Если Вам трудно объяснить, то помогите с примером!
Ведь Вы тоже когда-то так начинали.
и начинали мы все чайниками, но потом...

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

Сообщение Amed » 04.12.2006 (Пн) 15:11

Создай MDI-форму и две дочерние (Form1, Form2) в VB.

Код: Выделить всё
'В форме
Private Sub MDIForm_Load()
    Load Form1
    Load Form2
    EnumChildWindows MDIForm1.hwnd, AddressOf EnumChildProc, ByVal 0&
End Sub

'В модуле
Option Explicit

Declare Function GetDesktopWindow Lib "user32" () As Long
Declare Function EnumChildWindows Lib "user32" (ByVal hWndParent As Long, 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 GetWindowTextLength Lib "user32" Alias "GetWindowTextLengthA" (ByVal hwnd As Long) As Long

Public Function EnumChildProc(ByVal hwnd As Long, ByVal lParam As Long) As Long
    Dim sSave As String
    'Get the windowtext length
    sSave = Space$(GetWindowTextLength(hwnd) + 1)
    'get the window text
    GetWindowText hwnd, sSave, Len(sSave)
    'remove the last Chr$(0)
    sSave = Left$(sSave, Len(sSave) - 1)
    If sSave <> "" Then Form2.Print sSave
    'continue enumeration
    EnumChildProc = 1
End Function


Аналогично действуй. Ищи hwnd родительского окна и перечисляй все его дочерние mdi-окна.

Viper
Артефакт VBStreets
Артефакт VBStreets
Аватара пользователя
 
Сообщения: 4394
Зарегистрирован: 12.04.2005 (Вт) 17:50
Откуда: Н.Новгород

Сообщение Viper » 04.12.2006 (Пн) 15:15

Весь мир матрица, а мы в нем потоки байтов!

claymen
Продвинутый пользователь
Продвинутый пользователь
Аватара пользователя
 
Сообщения: 159
Зарегистрирован: 14.04.2006 (Пт) 16:07
Откуда: КЫРГЫЗСТАН г.Бишкек

ладно...

Сообщение claymen » 04.12.2006 (Пн) 15:46

Раз уж я так и не понял (пример Amed выводит на экран пустую Form1).
Вот решил отблагадорить того, кто мне поможет банкой/бутылкой хорошего пива. Т.к. я живу в КЫРГЫЗСТАНЕ, а это далеко от РОССИИ, то я перечислю на счет WebMoney 50 WMR тому, кто мне поможет с МОИМ примером.
Всетаки посильная помощь - должна ПООЩРЯТЬСЯ!
и начинали мы все чайниками, но потом...

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

Сообщение tyomitch » 04.12.2006 (Пн) 17:26

Хочу 50 WMR.
Вложения
50wmr.zip
(2.02 Кб) Скачиваний: 51
Изображение

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

Сообщение Amed » 04.12.2006 (Пн) 17:29

Отправлять Сергею Мерзликину :)

claymen
Продвинутый пользователь
Продвинутый пользователь
Аватара пользователя
 
Сообщения: 159
Зарегистрирован: 14.04.2006 (Пт) 16:07
Откуда: КЫРГЫЗСТАН г.Бишкек

Сообщение claymen » 04.12.2006 (Пн) 17:57

tyomitch
Извините, но Вы наверное не так поняли мою задачу.
Ваш пример говорит, что "Таких окон нет". А такое окно прямо передо мной. Если конкретнее, то:
Главная программа - Инфо-Бухгалтер
Ее дочернее окно - Редактор
И таких дочерних окон там много, но Ваш пример не видит их!

Мне нужен пример (или контрол), который бы видел эти окошки, а точнее их handl'ы!
и начинали мы все чайниками, но потом...

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

Сообщение Amed » 04.12.2006 (Пн) 18:03

claymen, а посмотри через spy++, какие дочерние окна видны у Инфо-Бухгалтер.

claymen
Продвинутый пользователь
Продвинутый пользователь
Аватара пользователя
 
Сообщения: 159
Зарегистрирован: 14.04.2006 (Пт) 16:07
Откуда: КЫРГЫЗСТАН г.Бишкек

Сообщение claymen » 04.12.2006 (Пн) 18:07

Amed
Интересное предложение, но у меня не VS, а где в сети можно скачать spy++?
и начинали мы все чайниками, но потом...

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

Сообщение tyomitch » 04.12.2006 (Пн) 18:10

claymen писал(а):tyomitch
Извините, но Вы наверное не так поняли мою задачу.
Ваш пример говорит, что "Таких окон нет". А такое окно прямо передо мной. Если конкретнее, то:
Главная программа - Инфо-Бухгалтер
Ее дочернее окно - Редактор
И таких дочерних окон там много, но Ваш пример не видит их!

Если нужно перечислять дочерние окна известного родителя hWndParent, то просто замени "EnumWindows AddressOf EnumWindowsProc, FindWindowByCaption" на "EnumChildWindows hWndParent, AddressOf EnumWindowsProc, FindWindowByCaption"
Изображение

claymen
Продвинутый пользователь
Продвинутый пользователь
Аватара пользователя
 
Сообщения: 159
Зарегистрирован: 14.04.2006 (Пт) 16:07
Откуда: КЫРГЫЗСТАН г.Бишкек

Сообщение claymen » 04.12.2006 (Пн) 18:17

tyomitch
После данной замены, VB выдает ошибку Variable not defined в строке:
EnumChildWindows hWndParent, AddressOf EnumWindowsProc, FindWindowByCaption
и начинали мы все чайниками, но потом...

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

Сообщение tyomitch » 04.12.2006 (Пн) 18:24

tyomitch писал(а):Если нужно перечислять дочерние окна известного родителя hWndParent, то просто замени "EnumWindows AddressOf EnumWindowsProc, FindWindowByCaption" на "EnumChildWindows hWndParent, AddressOf EnumWindowsProc, FindWindowByCaption"

В hWndParent нужно положить хэндл известного тебе родителя. Ты говоришь, что уже умеешь его находить, потому что его заголовок не меняется.
Изображение

claymen
Продвинутый пользователь
Продвинутый пользователь
Аватара пользователя
 
Сообщения: 159
Зарегистрирован: 14.04.2006 (Пт) 16:07
Откуда: КЫРГЫЗСТАН г.Бишкек

Сообщение claymen » 04.12.2006 (Пн) 19:17

tyomitch
я вставил вместо [b]hWndParent[b/] handle родителя, но после запуска (F5) когда стал вводить в поле первую букву названия дочернего окна, VB вызвал критичесскую ошибку и закрылся, так и не показав мне ни полного имени дочернего окни, ни его handle.
и начинали мы все чайниками, но потом...

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

Сообщение tyomitch » 04.12.2006 (Пн) 19:54

Проверяй...
Вложения
50wmr.zip
(2.15 Кб) Скачиваний: 37
Изображение

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

Сообщение tyomitch » 05.12.2006 (Вт) 10:10

Эх, кинули меня злые кыргызы... :-(
Изображение

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

Сообщение GSerg » 05.12.2006 (Вт) 10:14

А чего ты хотел от человека, который давеча спрашивал, как лучше украсть программу и продавать от своего имени.
Как только вы переберёте все варианты решения и не найдёте нужного, тут же обнаружится решение, простое и очевидное для всех, кроме вас

claymen
Продвинутый пользователь
Продвинутый пользователь
Аватара пользователя
 
Сообщения: 159
Зарегистрирован: 14.04.2006 (Пт) 16:07
Откуда: КЫРГЫЗСТАН г.Бишкек

Сообщение claymen » 05.12.2006 (Вт) 10:30

Я никого НЕ КИДАЛ!
Просто тот пример, после того как я ввожу handle родителя и запускаю пример - VB сообщает о критичесской ошибке и закрывается.
Так и не показав мне handle нужного окна!
и начинали мы все чайниками, но потом...

Viper
Артефакт VBStreets
Артефакт VBStreets
Аватара пользователя
 
Сообщения: 4394
Зарегистрирован: 12.04.2005 (Вт) 17:50
Откуда: Н.Новгород

Сообщение Viper » 05.12.2006 (Вт) 10:54

а каким чудным образом ты вводишь хэндл родителя?
Весь мир матрица, а мы в нем потоки байтов!

След.

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

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

Сейчас этот форум просматривают: SemrushBot и гости: 18

    TopList  
cron