Форум программистов, компьютерный форум, киберфорум
C++ Builder
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.89/9: Рейтинг темы: голосов - 9, средняя оценка - 4.89
 Аватар для QWIPQ
144 / 123 / 14
Регистрация: 10.10.2011
Сообщений: 366
Записей в блоге: 2

Обращение к класам окна сторонней программы

06.06.2012, 15:50. Показов 1901. Ответов 19
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Доброго времени суток, помоги пожалуйста решить проблему вот в двух словах что делаю:
-есть программа (ее хендл получаю при помощи GetNextWindow и GetWindowText)
-в программе есть куча кнопок классы которых названы одинаково (получаю всех детей родительского окна с помощью EnumWindowsProc и проверяю что нашлись те классы которые мне нужны)
-получаю необходимые мне идентификаторы кнопок (при помощи FindWindowEx)
-при помощи ws32.exe проверяю процесс на наличие классов и правильность получения идентификаторов от них(хендлов)
после того как нашел и проверил мне необходимо нажать последовательно сперва на одну кнопку потом на другую...пытался осуществить это так:
C++
1
2
3
4
5
//вариант №1
PostMessageA(h, WM_LBUTTONDOWN ,0,0);
PostMessageA(h, WM_LBUTTONUP ,0,0); 
//вариант №2
SendMessage(h, BM_CLICK, 0, 0)
но действие по клику не происходит...(мышкой когда вручную кликаешь открывается OpenDialog с выбором файла)
создал бесконечный цикл и наблюдал что происходит прорисовка кнопки на которую нажимаю(мерцание)

Помогите плз разобраться где могла быть ошибка.
Заранее очень благодарен

Добавлено через 1 час 49 минут
никто не может помочь?
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
06.06.2012, 15:50
Ответы с готовыми решениями:

Активность окна сторонней программы
Здравствуйте. Такой вопрос к знатокам) Как определить активно ли окно у сторонней программы? ничего внятного не нашел на просторах...

Изменение заголовка окна сторонней программы
Добрый день. Нужно изменить заголовок окна сторонней программы. Код: using System; using System.Collections.Generic; using...

Свернуть дочерние окна сторонней программы
Здравствуйте, подскажите пожалуйста как свернуть в трей все дочернии окна основной программы, сторонней. Основную программу скрываю...

19
317 / 268 / 61
Регистрация: 12.10.2011
Сообщений: 434
06.06.2012, 17:09
Из MSDN:
If the button is in a dialog box and the dialog box is not active, the BM_CLICK message might fail. To ensure success in this situation, call the SetActiveWindow function to activate the dialog box before sending the BM_CLICK message to the button.
1
 Аватар для QWIPQ
144 / 123 / 14
Регистрация: 10.10.2011
Сообщений: 366
Записей в блоге: 2
06.06.2012, 17:16  [ТС]
C++
1
2
3
4
5
SetActiveWindow(HOpen);
//SetActiveWindow(H);
PostMessage(HOpen, WM_LBUTTONDOWN, 0,0);
PostMessage(HOpen, WM_LBUTTONUP, 0, 0);
SendMessage(HOpen, BM_CLICK, 0,0);
H - идентификатор окна
HOpen - идентификатор кнопки

эффекта не дало пробовал оба варианта как показал выше...
0
 Аватар для Gremlin
519 / 307 / 58
Регистрация: 30.07.2008
Сообщений: 607
06.06.2012, 17:22
а если мышкой?
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
//---------------------------------------------------------------------------
void wj_MouseClickToWindow(HANDLE h, int x, int y)
{
    if(IsWindow(h))
    {
        Application->ProcessMessages();
        SendMessage(h, WM_LBUTTONDOWN, NULL, MAKELPARAM(x, y));
        Application->ProcessMessages();
        SendMessage(h, WM_LBUTTONUP, NULL, MAKELPARAM(x, y));
        Application->ProcessMessages();
    }
}
//---------------------------------------------------------------------------
0
 Аватар для QWIPQ
144 / 123 / 14
Регистрация: 10.10.2011
Сообщений: 366
Записей в блоге: 2
06.06.2012, 17:39  [ТС]
C++
1
2
3
4
5
6
7
8
9
10
11
void wj_MouseClickToWindow(HANDLE h, int x, int y)
{
    if(IsWindow(h))
    {
        Application->ProcessMessages();
        SendMessage(h, WM_LBUTTONDOWN, NULL, MAKELPARAM(x, y));
        Application->ProcessMessages();
        SendMessage(h, WM_LBUTTONUP, NULL, MAKELPARAM(x, y));
        Application->ProcessMessages();
    }
}
если я правильно понял X и Y обозначают координаты в пикселях внутри окна самого
код не срабатывает, пытался по-всякому... я так понял таким кодом по окну не кликает(окно активным не становится даже)
0
 Аватар для Gremlin
519 / 307 / 58
Регистрация: 30.07.2008
Сообщений: 607
06.06.2012, 18:47
QWIPQ, ну вообще-то оно и недолжно активным становиться, так как посылаются команды

да, кликает на X,Y в ХЕНЛД, но если на форме баттон, то надо ХЕНДЛ баттона и x,y указать в пределах например 2,3

2) лучше SendMessage
3) Скорее всего неправильно находите Handle кнопки
0
 Аватар для QWIPQ
144 / 123 / 14
Регистрация: 10.10.2011
Сообщений: 366
Записей в блоге: 2
06.06.2012, 22:26  [ТС]
Цитата Сообщение от Gremlin Посмотреть сообщение
2) лучше SendMessage
я разные пробовал методы отправки, ничего не получилось
Цитата Сообщение от Gremlin Посмотреть сообщение
3) Скорее всего неправильно находите Handle кнопки
нет, его нахожу правильно т.к. хедл совпадает с тем что отображается в ws32, и при зацикливании посылок на кнопку кнопка мерцает(прорисовывается многократного нажатия в секунду)
0
 Аватар для Samrisbe
1365 / 732 / 67
Регистрация: 28.01.2011
Сообщений: 2,069
06.06.2012, 23:41
Своих мыслей на сей счет нема...
Как программно отправить нажатие клавиши в окно
1
 Аватар для cpp_developer
20124 / 5691 / 417
Регистрация: 09.04.2010
Сообщений: 22,546
Записей в блоге: 1
07.06.2012, 00:08
Мечты вуайериста - чужие окна
Мечты вуайериста - чужие окна 2
1
 Аватар для QWIPQ
144 / 123 / 14
Регистрация: 10.10.2011
Сообщений: 366
Записей в блоге: 2
07.06.2012, 00:25  [ТС]
спс уже видел
Мечты вуайериста - чужие окна 3
0
 Аватар для QWIPQ
144 / 123 / 14
Регистрация: 10.10.2011
Сообщений: 366
Записей в блоге: 2
07.06.2012, 01:21  [ТС]
вот программа к которой получаю доступ и кнопки...
на данном этапе приходится работать через зажатие Alt+F и т.д. чтоб выполнить желаемое... но эт не очень удобно и код громоздко выглядит
Миниатюры
Обращение к класам окна сторонней программы  
0
Эксперт С++
 Аватар для Avazart
8489 / 6156 / 615
Регистрация: 10.12.2010
Сообщений: 28,683
Записей в блоге: 30
07.06.2012, 01:37
Есть пример управление калькулятором у Архангельского...
Там управление не через кнопки а через быстые клавиши - попробуй.
Т.е передавай фокус окну программы и имитируй нажатие Ctrl+O ( с помощью key_event)
1
 Аватар для QWIPQ
144 / 123 / 14
Регистрация: 10.10.2011
Сообщений: 366
Записей в блоге: 2
07.06.2012, 08:24  [ТС]
Цитата Сообщение от Avazart Посмотреть сообщение
Т.е передавай фокус окну программы и имитируй нажатие Ctrl+O ( с помощью key_event)
сейчас именно так и делается но там получается просто дофига кнопок нажимать надо вместо элементарного клика по двум кнопочкам
0
Эксперт С++
 Аватар для Avazart
8489 / 6156 / 615
Регистрация: 10.12.2010
Сообщений: 28,683
Записей в блоге: 30
07.06.2012, 13:57
Ну там только пример... как я поинмаю достаточно одного нажатия Ctrl+O ну и может быть еще Alt
0
 Аватар для QWIPQ
144 / 123 / 14
Регистрация: 10.10.2011
Сообщений: 366
Записей в блоге: 2
07.06.2012, 19:55  [ТС]
алгоритм какой:
в цикле от 1 до 23 делается следующее
1. вызов данной программы
2. Открытие: Alt+F затем Enter затем Ctrl+V затем Enter
2. Запуск: Alt+R затем Enter
3. Свернуть в трей
и только тогда начинается работа

тестировалось все на одном компе и без цикла а запускается на другом и с циклом

так вот когда решили запускать, не все копии программы одинаково исполняют мой код... я не слипую нигде, кроме ожидание на запуск программы... может в этом беда или лучше пытаться добиться работы через хендлы???
0
Эксперт С++
 Аватар для Avazart
8489 / 6156 / 615
Регистрация: 10.12.2010
Сообщений: 28,683
Записей в блоге: 30
07.06.2012, 20:02
не все копии программы одинаково исполняют мой код
Не понял, этот эдитор запускается не в одном экземпляре?
0
 Аватар для QWIPQ
144 / 123 / 14
Регистрация: 10.10.2011
Сообщений: 366
Записей в блоге: 2
07.06.2012, 20:15  [ТС]
есть программа "Advanced PDF Password Recovery" и если мой код который разбивает 'интервал' на 23 части... данная программа из моего кода вызывается 23 раза и принимать должна при нажатии в ней кнопку открыть определенные параметры после чего запуститься и свернуться...

так вот тот алгоритм который я описал выше не хочет работать одинаково во всех вызванных мною копиях программы(вызываю и подставляю данные в каждую по одной)... я имею ввиду что в некоторых она запускается но не сворачивается, в некоторых не запускается но сворачивается, в некоторых открывает файл но не сворачивается ну и т.д. и т.п.... а вопрос в чем может все дело в слипе или в чем-то еще???
0
Эксперт С++
 Аватар для Avazart
8489 / 6156 / 615
Регистрация: 10.12.2010
Сообщений: 28,683
Записей в блоге: 30
07.06.2012, 20:26
мною копиях программы
Не копий а экземпляров как я понимаю...

Ясное дело кнопки нажимаются в определенном окне т.е в том у которого сейчас фокус.
0
 Аватар для QWIPQ
144 / 123 / 14
Регистрация: 10.10.2011
Сообщений: 366
Записей в блоге: 2
07.06.2012, 20:41  [ТС]
да, ShellExecute вызывает программу с параметром SW_SHOW и ей передается фокус т.к. она выходит на передний план и становится активной... и темболее я получаю каждый хендл вызванного экземпляра и принудительно вывожу заранее до всех манипуляций на передний план и делаю фокусировку...
0
Эксперт С++
 Аватар для Avazart
8489 / 6156 / 615
Регистрация: 10.12.2010
Сообщений: 28,683
Записей в блоге: 30
07.06.2012, 20:47
Ну тогда поидее не должно быть проблем, но я бы проверил этот момент....
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
07.06.2012, 20:47
Помогаю со студенческими работами здесь

Скрытие окна запускаемой сторонней программы
Я решил вынести оставшийся вопрос отдельно. До этого уже обсуждали остальные мои вопросы. Не все захочется всё читать и вникать 0 дан ли...

Программное нажатие на кнопку окна сторонней программы
У себя в коде запускаю 3dsMax (через Process.Start()) на выполнение скрипта, в процессе работы всплывает предупреждение в виде MessageBox с...

Изменить тайтл окна сторонней программы, зная его дескриптор
Как изменить тайтл окна программы? Не своего приложения, а сторонней программы запущенной на компе. Дискриптор запущенного окна и...

3D из сторонней программы
Здравствуйте! Есть такая задача: создать чертёж и его 3D объект в некоторой программе и сделать доступным пользователю на сайте вращать...

Запуск сторонней программы из программы
Приветствую! Нужна ваша помощь. Есть две программы, одна собирает всю информацию о PC и пишет ее в файл, далее генерирует Private &...


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

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Новые блоги и статьи
Установка Qt Creator для C и C++: ставим среду, CMake и MinGW без фреймворка Qt
8Observer8 05.04.2026
Среду разработки Qt Creator можно установить без фреймворка Qt. Есть отдельный репозиторий для этой среды: https:/ / github. com/ qt-creator/ qt-creator, где можно скачать установщик, на вкладке Releases:. . .
AkelPad-скрипты, структуры, и немного лирики..
testuser2 05.04.2026
Такая программа, как AkelPad существует уже давно, и также давно существуют скрипты под нее. Тем не менее, прога живет, периодически что-то не спеша дополняется, улучшается. Что меня в первую очередь. . .
Отображение реквизитов в документе по условию и контроль их заполнения
Maks 04.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "ПланированиеСпецтехники", разработанного в конфигурации КА2. Данный документ берёт данные из другого нетипового документа. . .
Фото всей Земли с борта корабля Orion миссии Artemis II
kumehtar 04.04.2026
Это первое подобное фото сделанное человеком за 50 лет. Снимок называют новым вариантом легендарной фотографии «The Blue Marble» 1972 года, сделанной с борта корабля «Аполлон-17». Новое фото. . .
Вывод диалогового окна перед закрытием, если документ не проведён
Maks 04.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "СписаниеМатериалов", разработанного в конфигурации КА2. Задача: реализовать программный контроль на предмет проведения документа. . .
Программный контроль заполнения реквизитов табличной части документа
Maks 02.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "СписаниеМатериалов", разработанного в конфигурации КА2. Задача: 1. Реализовать контроль заполнения реквизита. . .
wmic не является внутренней или внешней командой
Maks 02.04.2026
Решение: DISM / Online / Add-Capability / CapabilityName:WMIC~~~~ Отсюда: https:/ / winitpro. ru/ index. php/ 2025/ 02/ 14/ komanda-wmic-ne-naydena/
Программная установка даты и запрет ее изменения
Maks 02.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "СписаниеМатериалов", разработанного в конфигурации КА2. Задача: при создании документов установить период списания автоматически. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru