Как узнать цвет в чужом окне, понажимать кнопки?

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

Как узнать цвет в чужом окне, понажимать кнопки?

Сообщение GorYU » 20.07.2005 (Ср) 17:43

Есть программа, окантовка её меняет цвет (два цвета), хотелось бы ловить изменение цвета, и параллельно нажимать в ней две кнопки.
Но программу я не писал и названия элементов её не знаю(spy++ не нашёл), да и как к ним обращаться.
Если кто в этом разбирается помогите, пожалуйста, можно на примере calc.exe

SHURUP
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 440
Зарегистрирован: 15.09.2004 (Ср) 14:24
Откуда: Ирпень, Украина

Сообщение SHURUP » 20.07.2005 (Ср) 18:50

Нам чужого не надо, но своё мы возьмем, чьё бы оно ни было...

GorYU
Новичок
Новичок
 
Сообщения: 25
Зарегистрирован: 20.07.2005 (Ср) 17:03

Сообщение GorYU » 21.07.2005 (Чт) 15:14

SHURUP, это я уже видел, спасибо, "spy++"- не главная проблема
я плохо представляю что такое hWnd, и как с ним общаться
если бы вы показали на примере любой windows'овской програмки как нажимать кнопки и считывать текст, было бы замечательно.

Twister
Теоретик
Теоретик
Аватара пользователя
 
Сообщения: 2251
Зарегистрирован: 28.06.2005 (Вт) 12:32
Откуда: Алматы

Сообщение Twister » 21.07.2005 (Чт) 15:43

hWnd - хэндл/дескриптор окна, по которому к нему можно обращаться.
Зная его можно полностью управлять окном... Смотри документацию, вообщем :wink:
А я все практикую лечение травами...

GorYU
Новичок
Новичок
 
Сообщения: 25
Зарегистрирован: 20.07.2005 (Ср) 17:03

Сообщение GorYU » 02.02.2008 (Сб) 20:30

С определением цвета, нажатием кнопок разобрался, spy++ нашёл)
Сейчас цвет определяется снятием картинки куска окна, для этого надо чтобы окно всегда было поверх других окон - не удобно и не всегда выполнимо.

Теперь вопрос из той же задачи, но немного другой.
Возьмём, например, калькулятор (%SystemRoot%\System32\calc.exe), WinXP. При наведении курсора на цифру, например, 1, появляется оранжевая окантовка у кнопки, Spy++ отлавливает сообщение
000F (Posted)
WM_PAINT


Как в VB6 отловить такое сообщение, уже имея hWnd

Atoman
Продвинутый пользователь
Продвинутый пользователь
Аватара пользователя
 
Сообщения: 109
Зарегистрирован: 01.02.2008 (Пт) 6:36

Сообщение Atoman » 02.02.2008 (Сб) 21:02

Sabclassing

Код: Выделить всё
Public Function WndProc(ByVal hwnd As Long, ByVal uMsg As Long, ByVal wParam As Long, ByVal lParam As Long)
    Select Case uMsg
    Case WM_PAINT:
        Call BeginPaint(hwnd ,Paint)
        '...
        ' Здесь код обработки сообщения
        '...
        Call EndPaint(hwnd, Paint)
        WndProc = 0
    Case Else:
        WndProc = DefWindowProc(hwnd, uMsg, wParam, lParam)
    End Select
End Function
Последний раз редактировалось Atoman 02.02.2008 (Сб) 21:40, всего редактировалось 1 раз.

dr.MIG
Гуру
Гуру
Аватара пользователя
 
Сообщения: 1441
Зарегистрирован: 18.12.2004 (Сб) 9:53
Откуда: г.Ярославль

Сообщение dr.MIG » 02.02.2008 (Сб) 21:27

Сабклассим чужое окно?...
Salus populi suprema lex

Atoman
Продвинутый пользователь
Продвинутый пользователь
Аватара пользователя
 
Сообщения: 109
Зарегистрирован: 01.02.2008 (Пт) 6:36

Сообщение Atoman » 02.02.2008 (Сб) 21:32

dr.MIG писал(а):Сабклассим чужое окно?...


Я не это имелвиду.
Я показал как можно ререхватить это сообщение.

А впринципе почему и нет ,если уже известен hWnd

dr.MIG
Гуру
Гуру
Аватара пользователя
 
Сообщения: 1441
Зарегистрирован: 18.12.2004 (Сб) 9:53
Откуда: г.Ярославль

Сообщение dr.MIG » 02.02.2008 (Сб) 21:42

Потому что низя... Чужое... :)
Salus populi suprema lex

GorYU
Новичок
Новичок
 
Сообщения: 25
Зарегистрирован: 20.07.2005 (Ср) 17:03

Сообщение GorYU » 02.02.2008 (Сб) 22:00

И код какой-то странный, явно не проверялся на реальность работы.
Если у меня уже будет значение uMsg, зачем писать функцию WndProc.

На входе должно быть только hWnd.

Atoman
Продвинутый пользователь
Продвинутый пользователь
Аватара пользователя
 
Сообщения: 109
Зарегистрирован: 01.02.2008 (Пт) 6:36

Сообщение Atoman » 02.02.2008 (Сб) 23:48

Так пардон.
Немого неправильно видимо понля вопрос.
Сейчас вроде догоняю ,тебе надо узнать от какого окна пришло сообщение?

GorYU
Новичок
Новичок
 
Сообщения: 25
Зарегистрирован: 20.07.2005 (Ср) 17:03

Сообщение GorYU » 03.02.2008 (Вс) 0:21

Есть окно, сижу фоткаю его, жду, когда у него цвет изменится, для этого надо чтобы окно не было ничем закрыто - это плохо, но работает.
При смене цвета окна spy++ улавливает сообщение от окна WM_PAINT, при этом не требуется, чтобы окно было на виду - это надо, но не знаю, как программно отловить.
Если spy++ может, значит и VB должен.
Отправить сообщение окну, проблемы нет, а как его принять, не пойму. В если работать с me.hwnd то что-то получается, а вот чужими окнами глухо.

jangle
Википедик
Википедик
Аватара пользователя
 
Сообщения: 3013
Зарегистрирован: 03.06.2005 (Пт) 12:02
Откуда: Нидерланды

Сообщение jangle » 03.02.2008 (Вс) 0:40

dr.MIG писал(а):Потому что низя... Чужое... :)


Все можно.. И чужое окно сабклассить. Но только осторожно! :)

jangle
Википедик
Википедик
Аватара пользователя
 
Сообщения: 3013
Зарегистрирован: 03.06.2005 (Пт) 12:02
Откуда: Нидерланды

Сообщение jangle » 03.02.2008 (Вс) 0:48

GorYU писал(а):При смене цвета окна spy++ улавливает сообщение от окна WM_PAINT, при этом не требуется, чтобы окно было на виду - это надо, но не знаю, как программно отловить.


Хук на WH_CALLWNDPROC этого приложения, и самому ловить WM_PAINT

Atoman
Продвинутый пользователь
Продвинутый пользователь
Аватара пользователя
 
Сообщения: 109
Зарегистрирован: 01.02.2008 (Пт) 6:36

Сообщение Atoman » 03.02.2008 (Вс) 13:58

jangle писал(а):Хук на WH_CALLWNDPROC этого приложения, и самому ловить WM_PAINT


Тоесть ты предлогаеш поставить глобальный хоок на систему,
на сколько мне помнится VB может поставить глобальный хоок на клаву и мышь.
Но где то здесь на форуме я видел тему про глобальные хооки,
и та вроде бы есть пример с реализацией.

Хакер
Телепат
Телепат
Аватара пользователя
 
Сообщения: 16478
Зарегистрирован: 13.11.2005 (Вс) 2:43
Откуда: Казахстан, Петропавловск

Сообщение Хакер » 03.02.2008 (Вс) 15:42

GorYU
Spy++ внедряется во все процессы системы.
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

GorYU
Новичок
Новичок
 
Сообщения: 25
Зарегистрирован: 20.07.2005 (Ср) 17:03

Сообщение GorYU » 03.02.2008 (Вс) 20:51

Хакер, это хорошо, а как мне хотя бы в один внедриться)
Googl'ом нашёл пару интересных архивов в тему.
http://examples.oreilly.com/subhookvb/Web%20Site%20Code.zip
http://www.a1vbcode.com/downloads/vbComCtl.zip
Без опыта общения с хуками - не помогли.

Есть у кого-нибудь мысли в виде рабочего куска кода?

Хакер
Телепат
Телепат
Аватара пользователя
 
Сообщения: 16478
Зарегистрирован: 13.11.2005 (Вс) 2:43
Откуда: Казахстан, Петропавловск

Сообщение Хакер » 03.02.2008 (Вс) 21:48

GorYU
Получить право писать в чужой процесс.
Записать свой код в АП чужого процесса.
Создать в чужом процессе новый поток из записанного кода. А новый поток будет чувствовать себя "как у себя дома" (это весьма относительно, конечно) в чужом процессе.
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

Денис
Доктор VB наук
Доктор VB наук
Аватара пользователя
 
Сообщения: 2734
Зарегистрирован: 07.11.2006 (Вт) 13:55
Откуда: Ейск, Краснодарский край

Сообщение Денис » 03.02.2008 (Вс) 23:47

Я дико извиняюсь за оффтопик, но...

Atoman
а Google ты тоже гооглом называешь? Непривычно, но Звучит, чёрт побери! :wink:
Программирование — богоизбранная дисциплина! Если бог и есть, то вселенную он скомпилировал, не иначе.

Atoman
Продвинутый пользователь
Продвинутый пользователь
Аватара пользователя
 
Сообщения: 109
Зарегистрирован: 01.02.2008 (Пт) 6:36

Сообщение Atoman » 03.02.2008 (Вс) 23:52

Смысл то понятен ,и звучит.

GorYU
Новичок
Новичок
 
Сообщения: 25
Зарегистрирован: 20.07.2005 (Ср) 17:03

Сообщение GorYU » 04.02.2008 (Пн) 1:20

Теории можно много насоветовать.
Кто-нибудь видел код?

Если всё так просто, что можно в общих словах сказать, думаю и пример будет не сложным, калькулятор есть у всех на нём можно и показать :)

Насколько я понял надо грамотно вызвать SetWindowsHookEx после чего принимать и обрабатывать сообщения от окна, WM_PAINT и другие.

jangle
Википедик
Википедик
Аватара пользователя
 
Сообщения: 3013
Зарегистрирован: 03.06.2005 (Пт) 12:02
Откуда: Нидерланды

Сообщение jangle » 04.02.2008 (Пн) 10:58

GorYU писал(а):Насколько я понял надо грамотно вызвать SetWindowsHookEx после чего принимать и обрабатывать сообщения от окна, WM_PAINT и другие.


Ты правильно все понял, только еще одна вещь. Вызов SetWindowsHookEx обязательно должен происходить из Native DLL

Atoman
Продвинутый пользователь
Продвинутый пользователь
Аватара пользователя
 
Сообщения: 109
Зарегистрирован: 01.02.2008 (Пт) 6:36

Сообщение Atoman » 04.02.2008 (Пн) 16:04

Вот посмотри здесь:
http://www.thalion.kiev.ua/idx.php/17/563/article/

Lumen
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 841
Зарегистрирован: 03.12.2005 (Сб) 16:09
Откуда: Брянск

Сообщение Lumen » 04.02.2008 (Пн) 19:56

Atoman
ERROR
The requested URL could not be retrieved
Подпись проходит рефакторинг

Atoman
Продвинутый пользователь
Продвинутый пользователь
Аватара пользователя
 
Сообщения: 109
Зарегистрирован: 01.02.2008 (Пт) 6:36

Сообщение Atoman » 04.02.2008 (Пн) 21:26

Яndex > WH_CALLWNDPROC
Гоогл > WH_CALLWNDPROC
Вложения
hook.rar
(41.14 Кб) Скачиваний: 81

Gemini
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 390
Зарегистрирован: 24.07.2002 (Ср) 14:15
Откуда: Ozersk

Сообщение Gemini » 04.02.2008 (Пн) 21:47

Есть предложение разобрать Код хука подробно, что бы все стало ясно.
Пример можно использовать хук клавы...

Я попробую начать. А те, кто разбераеться лучше правьте...
Это попытка перевисти из с ++ на vb

Код в длл:
Код: Выделить всё
Private Const WM_KEYDOWN = &H100

Private Function HookProc(ncode As Long, wParam As Long, lParam As Long) As Long

If ncode < 0 Then
        HookProc = CallNextHookEx(0&, ncode, wParam, lParam)
   If lParam = WM_KEYDOWN Then
      'Это для проверки...
      MsgBox ("Key Down = " & ncode & "  " & wParam & "  " & lParam)
    End If
End If

HookProc = CallNextHookEx(0&, ncode, wParam, lParam)
End Function




Программа Стандартный exe

Код: Выделить всё
Private Sub HOOKKEY_Click()
  hLib = LoadLibrary("hook.dll")

  hProc = GetProcAddress(hLib, "hookproc") 'здесь у меня загвоздка возвращает 0, видимо проблема со вторым параметром...

  hHook = SetWindowsHookEx(WH_KEYBOARD, hProc, hLib, 0&)
End Sub

Private Sub UNLOADPROG_Click()
If hHook Then UnhookWindowsHookEx (hHook)
If hLib Then FreeLibrary (hLib)
End Sub
В нашем деле главное ЛОГИКА.

косил косой косой косой.

Atoman
Продвинутый пользователь
Продвинутый пользователь
Аватара пользователя
 
Сообщения: 109
Зарегистрирован: 01.02.2008 (Пт) 6:36

Сообщение Atoman » 04.02.2008 (Пн) 22:09

Попробуй объявить функцию в длл вот так:
Код: Выделить всё
Public Function HookProc(ncode As Long, wParam As Long, lParam As Long) As Long

Gemini
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 390
Зарегистрирован: 24.07.2002 (Ср) 14:15
Откуда: Ozersk

Сообщение Gemini » 05.02.2008 (Вт) 13:31

Atoman
Нет... Всё так же возвращается 0.
Там надо подставить ProcName...
Какого процесса??? В примере используется имя функции.
В нашем деле главное ЛОГИКА.

косил косой косой косой.

Atoman
Продвинутый пользователь
Продвинутый пользователь
Аватара пользователя
 
Сообщения: 109
Зарегистрирован: 01.02.2008 (Пт) 6:36

Сообщение Atoman » 05.02.2008 (Вт) 17:48

Странно у меня твой код тоже ноль возвращает.

А вот здесь у меня всё нормально:
Код: Выделить всё
hLib = LoadLibrary(App.Path & "\Hook.dll")
hProc = GetProcAddress(hLib, "HookProc")
hHook = SetWindowsHookEx(WH_KEYBOARD, hProc, hLib, 0&)

Gemini
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 390
Зарегистрирован: 24.07.2002 (Ср) 14:15
Откуда: Ozersk

Сообщение Gemini » 06.02.2008 (Ср) 12:51

Atoman
А в чем разница???
Только то что ты указываешь полный путь к длл.
И ригистр верхний...

hLib = LoadLibrary(App.Path & "\Hook.dll")
hProc = GetProcAddress(hLib, "HookProc")

А у меня exe и dll лежат в одной папке. И я вижу как программка загужает этот длл (появляеться в загруженных модулях программы)
В нашем деле главное ЛОГИКА.

косил косой косой косой.

След.

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

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

Сейчас этот форум просматривают: Google-бот и гости: 95

    TopList  
cron