![]() |
|
Модераторы: feodorv, GremlinProg, xvr, Fixin |
![]()
|
|
| Temdegon |
|
||||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 429 Регистрация: 11.10.2008 Где: Minsk Репутация: нет Всего: 9 |
Есть "подопытная" программа - PokerStove.
http://www.pokerstove.com/ ![]() Нужно из другой программы задать текст в окошках "Player1", "Player2" и нажать кнопку "Evalute".
Как более грамотно добраться до хэндлов нужных мне окошек я придумать не смог, по этому решил проблему влоб. Проблема заключается в следующем: функция
Срабатывает как нужно, нужный текст в окошке появляется, НО программа не работает. Если затать параметры таким образом и нажать Evalute, то ничего не происходить, как будто в полях ввода пусто. Есть один ньюанс - когда вводишь вручную текст с клавиатуры, цвет контрола меняется на красный, если там какие-то недопустимые символы, т.е. программа обробатывает ввод пользователя на лету, а не в момент нажатия кнопки Evalute. Получается, что я задаю текст через WM_SETTEXT, но так как контрол не в фокусе или по каким-то другим причитам, программа считает что там все еще пусто. Если например после вызова WM_SETTEXT в поле добавить пробел и стереть его, то все отработает нормально. Подскажите пожалуйста, как мне выкрутиться и задать текст в контролы так, что бы программа работала нормально? |
||||
|
|||||
| GremlinProg |
|
|||
|
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 2706 Регистрация: 9.8.2005 Где: Тюмень Репутация: 99 Всего: 106 |
в принципе, такое возможно, но по-моему, полностью отвязаться от данных класса EDIT врят-ли получилось , например клавиши delete, left, right, end, home и т.п. довольно непросто учитывать виртуально, поэтому, скорее всего, текст таки берется из EDIT'а, но в момент нажатия клавиш. можно просто послать в окно WM_CHAR или сгенерировать какой-нибудь Ctrl (если обработка идет на WM_KEYxxx) сразу после WM_SETTEXT либо сгенерировать 2 символа после WM_SETTEXT: space + backspace сгенерировать нажатия клавиш можно с помощью SendInput либо keybd_event, не забывая при этом поставить фокус ввода в EDIT Добавлено через 2 минуты и 32 секунды лучше генерировать end + space + backspace, чтобы не затирать ввод после SetWindowText -------------------- "Гений всегда разумнее, чем умнее. Ум — это машина, разум — водитель этой машины." |
|||
|
||||
| Temdegon |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 429 Регистрация: 11.10.2008 Где: Minsk Репутация: нет Всего: 9 |
Решил проблему. Перед посылкой сообщения WM_SETTEXT, делаю WM_SETFOCUS для того же хэндла и все работает как нужно.
Параллельно в тему вопрос по хэндлам контролов. Они назначаются как-то всегда одинаково? могу ли я хардкодом забить хэндлы контролов и потом использовать? или они всегда будут отличаться? А то код получения нужных мне хэндлов выглядит страшно громоздко и некрасиво. Возможен ли такой вариант, через findFindow, я буду получать хэндл главного окна, а потом прибавлять к нему какие-то заранее расчитанные смещения для полученя хэндлов дочерних кнотролов? Или такие "смещения" могут отличаться от запуска к запуску? Это сообщение отредактировал(а) Temdegon - 2.1.2009, 23:51 |
|||
|
||||
| GremlinProg |
|
|||
|
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 2706 Регистрация: 9.8.2005 Где: Тюмень Репутация: 99 Всего: 106 |
дескрипторы окон никогда не будут повторяться, разве что по стечению обстоятельств, но хардкором их забивать точно нет смысла, для упрщения поиска, смотри на идентификаторы этих окон (GetDlgCtrlID), вот их и можно фиксировать -------------------- "Гений всегда разумнее, чем умнее. Ум — это машина, разум — водитель этой машины." |
|||
|
||||
| Temdegon |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 429 Регистрация: 11.10.2008 Где: Minsk Репутация: нет Всего: 9 |
![]() (Скрин из Microsoft Spy++) Вы имеете ввиду это? А можно ли как-то получить хэндл имея этот ID? или нужно перебрать все дочерние окна и проверять их ID? Проблема в том, что приложение имеет достаточно сложную древовидную структуру, и я слабо себе представляю, как обойти все дочерние окна. Может есть какой-то уже готовый алгоритм обхода всех дочерних окон любой вложенности? Быстрый поиск в гугле ничего подходящего не дал. Дело в том, что весь этот код будет засунут в DLL в виде одной функции и вызываться из Java. Т.е. будет функция, принимающаяя несколько строк в качестве аргументов, она будет засовывать их в нужные Edit-ы, нажимать кнопку запуска расчета, забирать готовый результат и возвращать его в Java-код. Сам расчет, выполняемых этой программой достаточно сложный и быстрым его назвать никак нельзя, не хотелось бы при каждом запуске этой функции заново по-кривому обходить все дочерние окна только что бы узнать их хэндлы, и тратить на это процессорное время. Но технология запуска native-кода из java не позваляет сохранить где-то хэндлы, полученные при первом запуске, и использовать их при повторном запуске функции. По этому хотелось бы добиться максимальной простоты и скорости в обходе дочерних окон? Может есть функция, которая по ID вернет хэндл окна? |
|||
|
||||
| GremlinProg |
|
|||
|
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 2706 Регистрация: 9.8.2005 Где: Тюмень Репутация: 99 Всего: 106 |
да, это и есть идентификатор окна да, есть: GetDlgItem первым аргументом ей нужно указать дескриптор корневого родительского окна вторым - идентификатор для поиска на счет любой вложенности - не уверен, но вроде бы GetDlgItem в глубину тоже ищет, если не находит на текущем уровне -------------------- "Гений всегда разумнее, чем умнее. Ум — это машина, разум — водитель этой машины." |
|||
|
||||
| Temdegon |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 429 Регистрация: 11.10.2008 Где: Minsk Репутация: нет Всего: 9 |
Спасибо за помощь и быстрое реагирование! Почитаю про эту функцию и буду экспериментировать. К сожелению, не могу выразить благодарность в более актуальной форме, ибо недостаточно постов =(
Вроди как в глубину она не ищет, но все равно, это сильно упрощает получение хэндлов. Это сообщение отредактировал(а) Temdegon - 3.1.2009, 01:05 |
|||
|
||||
| Earnest |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 5962 Регистрация: 17.6.2005 Где: Рязань Репутация: 33 Всего: 183 |
Точно не ищет, но при известной глубине вложенности это не проблема.
Я выразила за тебя -------------------- ... |
|||
|
||||
![]()
|
| Правила форума "C/C++: Системное программирование и WinAPI" | |
|
|
На данный раздел распространяются Правила форума и Правила раздела С++:Общие вопросы . Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Chipset, Step, Fixin, GremlinProg, xvr. feodorv. |
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | C/C++: Системное программирование и WinAPI | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |