| Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
| Форум программистов > C/C++: Системное программирование и WinAPI > [CE] Получить текст из объекта класса PIEHTML |
| Автор: ksili 16.12.2009, 09:56 |
| Мне надо получить текст из одного приложения. На нём находится окно с именем класса DISPLAYCLASS, на нём в свою очередь окно с именем класса PIEHTML. Вот из него мне и нужен текст. HWND этого окна я получаю. Но вот GetWindowText возвращает пустую строку. Как получить текст из этого хитрого контрола? Насколько я понял, это контрол для отображения форматированного текста. На окне как раз такой и отображается. Вообще, у приложения Remote Spy находит ещё пару контролов, но они либо отображаются в нём без текста (как и PIEHTML), либо не с тем текстом, который мне нужен. Так что я предположил, что нужный мне текст как раз и прячется где-то в недрах PIEHTML. Это всё под Windows Mobile 6.1. Но полагаю, что здесь ничего специфического для него нет. |
| Автор: ksili 16.12.2009, 12:07 | ||
| Я уже разобрался, что данный контрол имеет свом специфичные сообщения, описанные в Htmlctrl.h. Сначала сообщением DTM_SELECTALL контролу DISPLAYCLASS выделяем весь текст (это работает - видно на экране), а потом его можно весь скопировать в поток сообщением DTM_COPYSELECTIONTONEWISTREAM. Но почему-то поток так и остается пустой. Пробовал его посылать и в DISPLAYCLASS и в PIEHTM. Беда ещё в том, что сообщение DTM_COPYSELECTIONTONEWISTREAM вообще не документировано. Вот код, может ошибки увидите:
|
| Автор: GremlinProg 16.12.2009, 12:18 | ||
http://dalelane.co.uk/blog/?p=191 можно попробовать через буфер обмена |
| Автор: ksili 16.12.2009, 12:23 | ||||||
GremlinProg, там же ниже написано:
|
| Автор: ksili 16.12.2009, 13:12 |
| Пробую через буфер обмена. После выделения текста посылаю WM_COPY. Потом пробую GetClipboardData с параметром CF_TEXT или CF_UNICODETEXT. Всегда возвращается нулевой хэндл. Хочу ещё попробовать просто слать нажатие на Ctrl+C. Подскажите как это проще сделать на чистом API. |
| Автор: GremlinProg 16.12.2009, 13:17 | ||
а фокус стоит на контроле перед копированием?
|
| Автор: GremlinProg 16.12.2009, 13:32 |
| если WM_COPY не срабатывает, значит и результат от Ctrl+C скорее будет таким же текст вообще копируется в буфер обмена, вживую? если да, то WM_COPY тут ни при чем, смотри за работой с буфером обмена, может еще и с выделением лучше конечно не пинать воздух, а смотреть на конкретный код |
| Автор: ksili 16.12.2009, 13:34 |
| Это идея. ::SetFocus возвращает ERROR_INVALID_WINDOW_HANDLE. Хотя перед этим по этому же хэндлу нормально выделяется весь текст. Добавлено через 3 минуты и 4 секунды Это всё на девайсе происходит. Кнопки Ctrl тут нет. Контекстного меню у данного окна тоже не вылазит. Так что чёрт его знает. |
| Автор: ksili 16.12.2009, 13:51 | ||
А вот в коде из самого первого поста нету случайно ошибки в следующих строках?
Я раньше с такими потоками не работал. Может там ещё память выделять надо? |
| Автор: GremlinProg 16.12.2009, 13:52 | ||
это он так скорее всего на чужой поток ругается, поставить фокус в чужое окно можно только между AttachThreadInput, но я не вижу ее в CE, вижу только упоминание: http://msdn.microsoft.com/en-us/library/ms961490.aspx Добавлено через 5 минут и 27 секунд
вообще может, но без документации можно предположить, что pStream инициализируется в ответ на сообщение, поэтому и передается по ссылке Добавлено через 6 минут и 18 секунд т.е. вполне возможно, что ошибок там нет, особенно после забега в гугл |
| Автор: ksili 19.12.2009, 18:35 |
| В общем, похоже я всё делал правильно. Проблема скорее всего в девайсе (Samsung SGH-i900 WiTu), а точнее специфическом ПО на нём, от производителя. Они там вроде так специально сделали, чтобы нельзя было программно читать ответы на USSD-запросы. Знаю одну программу, которая эту проблему обошла, но они там вроде что-то в системных файлах подменяют. |