Форум программистов, компьютерный форум, киберфорум
C++: WinAPI
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.73/30: Рейтинг темы: голосов - 30, средняя оценка - 4.73
Пробующий
185 / 98 / 10
Регистрация: 28.04.2009
Сообщений: 1,104
1

Найти Handle кнопки

09.01.2011, 22:29. Показов 5739. Ответов 10
Метки нет (Все метки)

Есть HWND окна, на котором располагаются кнопки и текстовые поля.
Как определить HWND кнопок и тест из полей ввода вытащить, если функция EnumChildWindows для этого окна не находит дочерних окон(( Что это такое не понимаю. Когда я ставлю курсор в поле ввода, то он не "моргает". Неужели эти кнопки и поля - просто Bitmap?
Я уже пробовал функции WindowFromPoint(),
GetTopWindow(), GetForegroundWindow(), вызывал SetFocus, а затем EnumChildWindow - все равно не помогает. HWND кнопок я не получил. Хотя каждая кнопка на форме должна иметь Handle.
HWND самого окна я определил правильно, потому как, если послать ему SendMessage(hWnd, WM_CLOSE, 0, 0); - оно закрывается.
Еще пробовал GetDlgItem(hWnd_окна, перебрал все значения беззнакового int) - но ничего не нашло
Кстати некоторые поля ввода размещены не сразу на форме, а на панелях. Но не все. Несколько - сразу на форме.
Возможно все поля нарисованы, но неужели кто-то так морочил себе голову в Visual C++ 5.0. Дело в том, что программа, что окно я изучаю, написана в VC++ 5.0.
0

Помощь в написании контрольных, курсовых и дипломных работ здесь.

Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
09.01.2011, 22:29
Ответы с готовыми решениями:

Что означает выражение HANDLE hWritePipe = (HANDLE)atoi(argv[1]);
К тому же у меня нет 1-го. только нулевой

Получить handle кнопки в нестандартом случае
Есть программа при просмотре программы в Spy++ определяется две кнопки в одном классе "TBitBtn" и...

Считать caption кнопки зная handle
Здравствуйте. Как можно считать caption статус бара или другого любого объекта зная handle Есть...

Отправка текста и имитация кнопки в неактивное окно( по handle )
Всем доброго времени суток, столкнулся с проблемой, мне необходимо отправить нажатие клавиши Enter...

10
Почетный модератор
Эксперт .NET
8693 / 3645 / 404
Регистрация: 14.06.2010
Сообщений: 4,513
Записей в блоге: 9
09.01.2011, 22:31 2
Цитата Сообщение от galileopro Посмотреть сообщение
Хотя каждая кнопка на форме должна иметь Handle.
Необязательно. Например контролы в WPF не имеют хендлов, он есть только у формы - потому что всё отрисовывает DirectX.

По моему единственный вариант в данном случае - это читать память процесса. Посмотри функцию ReadProcessMemory (у неё также есть аналоги, но я не помню их имена) - она должна помочь.

Добавлено через 1 минуту
Цитата Сообщение от galileopro Посмотреть сообщение
Visual C++ 5.0
О блин, не заметил. Возможно действительно всё отрисовано. Посмотри ещё GetWindow, но я сомневаюсь что она поможет.

А что за программка?
1
Пробующий
185 / 98 / 10
Регистрация: 28.04.2009
Сообщений: 1,104
09.01.2011, 22:35  [ТС] 3
Могу приаттачить. Обычная такая прога, считает какие-то параметры и визуализирует. исходников у меня нет, но она компилировалась точно в Visual C++ 5.0. Я проверил PEiD (прога такая, читает инфу об Pe-exe) и в Win-Hex я смотрел - вроде VC++
приложение.rar
Mode-Dialog
А потом Process-Start
Выскочит окно "Panel Setting". На нем 4 кнопки, часики, текстовые поля и поля выбора. Нужно сторонним приложением поклацать на кнопки и вывод\ввод текста осуществить. Хакать мне её не надо, просто нужно управлять этими параметрами сторонним приложением.
Меня настораживает, что курсор в текстовых полях не мигает. Есть какой-то способ "наверняка" проверить, что эти текстовые поля - не окна? (Может просто они создаются в каком-то потоке, инфу о котором система не отдает простым EnumChildWindows)
0
Пробующий
185 / 98 / 10
Регистрация: 28.04.2009
Сообщений: 1,104
09.01.2011, 22:50  [ТС] 4
А по какому ключу мне в памяти процесса пытаться искать? По тексту, который введен в поля? И по надписям кнопок?
0
Почетный модератор
Эксперт .NET
8693 / 3645 / 404
Регистрация: 14.06.2010
Сообщений: 4,513
Записей в блоге: 9
09.01.2011, 23:25 5
Вообще странная программа, главная форма постоянно создает новые контролы, поэтому и нельзя отследить handle, даже Spy++ зацикливается во время поиска. Окно Panel Settings больше похоже на окно ресурсов, но нет - это единое целое, т.к. все сообщения (вне зависимости от того какой элемент выбран на форме) обрабатываются окном.... Щас ещё посмотрю...

Пока могу как вариант предложить нажимать на кнопки (если надо) с помощью сообщений SendMessage по определенным координатам....
Чтение памяти процесса здесь вряд ли будет эффективным, очень много надо будет сравнивать...

Добавлено через 12 минут
Например с помощью ArtMoney найти значения получается...
1
Пробующий
185 / 98 / 10
Регистрация: 28.04.2009
Сообщений: 1,104
09.01.2011, 23:53  [ТС] 6
SendMessage по определенным координатам....
Кнопки ладно. Но вот посылать все сообщения в "текстовые поля") это уже похуже. Ну да ладно.

Добавлено через 7 минут
ArtMoney действительно находит. Можно попробовать точно также сканировать, а потом заменять текстовые значения в адресном пространстве потока этого приложения.
0
Почетный модератор
Эксперт .NET
8693 / 3645 / 404
Регистрация: 14.06.2010
Сообщений: 4,513
Записей в блоге: 9
10.01.2011, 00:00 7
Только ArtMoney работает принципом "Нашли похожее -> Поменяли исходное значение -> Отсеяли" (и опять по кругу если ничего не найдено).

Тебе тогда придется ручками вводить нужное значение для поиска (для каждого поля) и производить операции описанные выше... А это уже почти никакой автоматизации
1
Пробующий
185 / 98 / 10
Регистрация: 28.04.2009
Сообщений: 1,104
10.01.2011, 00:13  [ТС] 8
Хотелось бы перечитать все текстовые значения, которые принадлежат HWND этого окошка "Panel Setting" и загнать в listbox. А потом менять их в listbox и чтобы они менялись в той форме. Как думаете, это возможно? Или тип данных "текст, массив символов с \0 на конце" в адресном пространстве потока той формы так просто не найти, и он никак не отличим от других данных?
Насчет кнопок, то тут действительно прийдется слать MuseDown и в lParaw(или WParam) передавать нужные координаты, но тут тоже можно автоматизировать: сделать GetDC() этой форме и сохранить её в Bitmap, и по таймеру эту картинку обновлять, это я к чему говорю, можно своим приложением создавать такую-же форму с такими же кнопками и размерами и клацать в ней, а отсылать той форме.
0
Почетный модератор
Эксперт .NET
8693 / 3645 / 404
Регистрация: 14.06.2010
Сообщений: 4,513
Записей в блоге: 9
10.01.2011, 00:31 9
Цитата Сообщение от galileopro Посмотреть сообщение
адресном пространстве потока
* адресном пространстве процесса.

Тебе нужно читать память процесса, а без опоры на какое-то значение, найти то что надо, мне кажется почти невозможно.
Цитата Сообщение от galileopro Посмотреть сообщение
и он никак не отличим от других данных
Текст расположен в памяти как массив байт (в данной программе все строки хранятся в ASCII кодировке, т.е. 1 символ = 1 байт), но проблема может возникнуть в том чтобы отсечь весь мусор, а он будет 100%.

Вот числовые значения найти будет почти невозможно, тут нужно использовать принцип ArtMoney.

Тут нужно пробовать, а не размышлять
1
Пробующий
185 / 98 / 10
Регистрация: 28.04.2009
Сообщений: 1,104
10.01.2011, 00:33  [ТС] 10
Еще остался вопрос: так что же все таки это такое, неужели все абсолютно нарисовано средствами GDI, я имею ввиду форму эту. Просто когда клацаешь на поля выбора (режимы разные выбираешь), то такое впечатление, что это все-таки какой-то контрол.
0
Почетный модератор
Эксперт .NET
8693 / 3645 / 404
Регистрация: 14.06.2010
Сообщений: 4,513
Записей в блоге: 9
10.01.2011, 00:36 11
Цитата Сообщение от galileopro Посмотреть сообщение
неужели все абсолются нарисовано средствами GDI
Мне кажется да, но точно утверждать не буду. С таким кол-вом отрисовки элементов с помощью GDI я не встречался.

Могу предположить что схема такая: есть буфер (изображение) на котором всё рисуется, и в программе выделены специальные области, в которых находятся данные которые можно изменить, и при любых действия со стороны юзера перерисовывается только нужная область.
1
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
10.01.2011, 00:36

Как программно выполнить нажатие кнопки в приложении, если у нее нет handle?
Наверно, вопрос, странный, но как вообще работать с интерфейсом стороннего приложения, если оно...

Как выбрать окно, если его handle не совпадает с handle процесса?
Добрый день! Задача на первый взгляд довольно простая: выбрать окно программы, переместить его в...

Ошибка в window.captureEvents(Event.CLICK); window.onClick= handle; function handle(e) { alert(''); return false; }
<script> window.captureEvents(Event.CLICK); window.onClick= handle; function handle(e) { ...

Application.Handle выдает identifier idents no member "Handle", на Дельфи всё работает
Не компилируется к примеру код: begin MessageDlg('Уже поздно. Будь послушным мальчиком. '+ ...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
11
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2021, vBulletin Solutions, Inc.