![]() |
|
Модераторы: feodorv, GremlinProg, xvr, Fixin |
![]()
|
|
| ksili |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2069 Регистрация: 3.11.2005 Где: Красноярск Репутация: 1 Всего: 17 |
Мне надо получить текст из одного приложения. На нём находится окно с именем класса DISPLAYCLASS, на нём в свою очередь окно с именем класса PIEHTML. Вот из него мне и нужен текст. HWND этого окна я получаю. Но вот GetWindowText возвращает пустую строку. Как получить текст из этого хитрого контрола? Насколько я понял, это контрол для отображения форматированного текста. На окне как раз такой и отображается.
Вообще, у приложения Remote Spy находит ещё пару контролов, но они либо отображаются в нём без текста (как и PIEHTML), либо не с тем текстом, который мне нужен. Так что я предположил, что нужный мне текст как раз и прячется где-то в недрах PIEHTML. Это всё под Windows Mobile 6.1. Но полагаю, что здесь ничего специфического для него нет. -------------------- Ничто так не развивает аналитическое мышление, как отладка сложной программы без возможности пошагового выполнения (с) |
|||
|
||||
| GremlinProg |
|
||||
|
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 2706 Регистрация: 9.8.2005 Где: Тюмень Репутация: 99 Всего: 106 |
GetWindowText работает только в своем процессе, пробуй посылать WM_GETTEXT через SendMessage
в принципе, чтобы показать форматированный текст не обязательно пользоваться особыми контролами, это может быть и простое окно ( в WM, насколько знаю, RichEdit вообще отсутствует, это и есть та специфичная разница ) -------------------- "Гений всегда разумнее, чем умнее. Ум — это машина, разум — водитель этой машины." |
||||
|
|||||
| ksili |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2069 Регистрация: 3.11.2005 Где: Красноярск Репутация: 1 Всего: 17 |
Я уже разобрался, что данный контрол имеет свом специфичные сообщения, описанные в Htmlctrl.h. Сначала сообщением DTM_SELECTALL контролу DISPLAYCLASS выделяем весь текст (это работает - видно на экране), а потом его можно весь скопировать в поток сообщением DTM_COPYSELECTIONTONEWISTREAM. Но почему-то поток так и остается пустой. Пробовал его посылать и в DISPLAYCLASS и в PIEHTM.
Беда ещё в том, что сообщение DTM_COPYSELECTIONTONEWISTREAM вообще не документировано. Вот код, может ошибки увидите:
Это сообщение отредактировал(а) ksili - 16.12.2009, 12:09 -------------------- Ничто так не развивает аналитическое мышление, как отладка сложной программы без возможности пошагового выполнения (с) |
|||
|
||||
| GremlinProg |
|
|||
|
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 2706 Регистрация: 9.8.2005 Где: Тюмень Репутация: 99 Всего: 106 |
http://dalelane.co.uk/blog/?p=191 можно попробовать через буфер обмена -------------------- "Гений всегда разумнее, чем умнее. Ум — это машина, разум — водитель этой машины." |
|||
|
||||
| ksili |
|
||||||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2069 Регистрация: 3.11.2005 Где: Красноярск Репутация: 1 Всего: 17 |
GremlinProg, там же ниже написано:
-------------------- Ничто так не развивает аналитическое мышление, как отладка сложной программы без возможности пошагового выполнения (с) |
||||||
|
|||||||
| ksili |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2069 Регистрация: 3.11.2005 Где: Красноярск Репутация: 1 Всего: 17 |
Пробую через буфер обмена. После выделения текста посылаю WM_COPY. Потом пробую GetClipboardData с параметром CF_TEXT или CF_UNICODETEXT. Всегда возвращается нулевой хэндл.
Хочу ещё попробовать просто слать нажатие на Ctrl+C. Подскажите как это проще сделать на чистом API. -------------------- Ничто так не развивает аналитическое мышление, как отладка сложной программы без возможности пошагового выполнения (с) |
|||
|
||||
| GremlinProg |
|
|||
|
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 2706 Регистрация: 9.8.2005 Где: Тюмень Репутация: 99 Всего: 106 |
а фокус стоит на контроле перед копированием?
-------------------- "Гений всегда разумнее, чем умнее. Ум — это машина, разум — водитель этой машины." |
|||
|
||||
| GremlinProg |
|
|||
|
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 2706 Регистрация: 9.8.2005 Где: Тюмень Репутация: 99 Всего: 106 |
если WM_COPY не срабатывает, значит и результат от Ctrl+C скорее будет таким же
текст вообще копируется в буфер обмена, вживую? если да, то WM_COPY тут ни при чем, смотри за работой с буфером обмена, может еще и с выделением лучше конечно не пинать воздух, а смотреть на конкретный код -------------------- "Гений всегда разумнее, чем умнее. Ум — это машина, разум — водитель этой машины." |
|||
|
||||
| ksili |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2069 Регистрация: 3.11.2005 Где: Красноярск Репутация: 1 Всего: 17 |
Это идея.
::SetFocus возвращает ERROR_INVALID_WINDOW_HANDLE. Хотя перед этим по этому же хэндлу нормально выделяется весь текст. Добавлено через 3 минуты и 4 секунды Это всё на девайсе происходит. Кнопки Ctrl тут нет. Контекстного меню у данного окна тоже не вылазит. Так что чёрт его знает. -------------------- Ничто так не развивает аналитическое мышление, как отладка сложной программы без возможности пошагового выполнения (с) |
|||
|
||||
| ksili |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2069 Регистрация: 3.11.2005 Где: Красноярск Репутация: 1 Всего: 17 |
А вот в коде из самого первого поста нету случайно ошибки в следующих строках?
Я раньше с такими потоками не работал. Может там ещё память выделять надо? -------------------- Ничто так не развивает аналитическое мышление, как отладка сложной программы без возможности пошагового выполнения (с) |
|||
|
||||
| GremlinProg |
|
|||
|
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 2706 Регистрация: 9.8.2005 Где: Тюмень Репутация: 99 Всего: 106 |
это он так скорее всего на чужой поток ругается, поставить фокус в чужое окно можно только между AttachThreadInput, но я не вижу ее в CE, вижу только упоминание: http://msdn.microsoft.com/en-us/library/ms961490.aspx Добавлено через 5 минут и 27 секунд
вообще может, но без документации можно предположить, что pStream инициализируется в ответ на сообщение, поэтому и передается по ссылке Добавлено через 6 минут и 18 секунд т.е. вполне возможно, что ошибок там нет, особенно после забега в гугл -------------------- "Гений всегда разумнее, чем умнее. Ум — это машина, разум — водитель этой машины." |
|||
|
||||
| ksili |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2069 Регистрация: 3.11.2005 Где: Красноярск Репутация: 1 Всего: 17 |
В общем, похоже я всё делал правильно. Проблема скорее всего в девайсе (Samsung SGH-i900 WiTu), а точнее специфическом ПО на нём, от производителя. Они там вроде так специально сделали, чтобы нельзя было программно читать ответы на USSD-запросы. Знаю одну программу, которая эту проблему обошла, но они там вроде что-то в системных файлах подменяют.
-------------------- Ничто так не развивает аналитическое мышление, как отладка сложной программы без возможности пошагового выполнения (с) |
|||
|
||||
![]()
|
| Правила форума "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. |