![]() |
|
Модераторы: feodorv, GremlinProg, xvr, Fixin |
![]()
|
|
| Gradov |
|
|||
|
Шустрый ![]() Профиль Группа: Участник Сообщений: 124 Регистрация: 31.10.2006 Репутация: нет Всего: 3 |
Привет. Есть такая задача. Надо вставить текст в любой компонент, который поддерживает ввод текста на любой форме. Хук на клаву я ставлю - все ok! Также могу посимвольно ввести текст в компонент, а вот полностью вставить текст не знаю как. Это актуально для больших текстов из 1000 символов и более. Если по одному символу вставлять, то получается ... фигня в общем - очень медленно.
Можно, конечно, использовать буфер обмена для этого, но тогда затрется ведь то что в clipboard находится - а это уже не годится, так как пользователь может использовать буфер обмена для своих целей. Вот к примеру Punto Switcher это же умудряется делать. Он вставляет текст замены очень быстро, т.е. точно не посимвольно а сразу целиком. Как же это у них реализовано? |
|||
|
||||
| nerdy_weirdie |
|
|||
![]() Бывалый ![]() Профиль Группа: Участник Сообщений: 179 Регистрация: 16.1.2007 Репутация: нет Всего: нет |
Попробуй ::SetWindowText()
а чтобы фильтровать контролы посмотри их свойства при помощи Spy++ Добавлено через 5 минут и 24 секунды И, если мне не изменяет память, эта вот фраза из мсдна "However, SetWindowText cannot change the text of a control in another application." - суеверная брехня. Это сообщение отредактировал(а) nerdy_weirdie - 3.5.2009, 18:19 |
|||
|
||||
| 586 |
|
|||
|
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2243 Регистрация: 8.5.2006 Репутация: 39 Всего: 146 |
А у меня были проблемы при вызове GetWindowText(WindowFromPoint(...), ...); - у некоторых объектов не определялся текст, а с SendMessage(WindowFromPoint(...), WM_GETTEXT, ...) нормально работает. Добавлено через 52 секунды Windows XP SP2 |
|||
|
||||
| GremlinProg |
|
||||
|
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 2706 Регистрация: 9.8.2005 Где: Тюмень Репутация: 99 Всего: 106 |
586, так и есть
nerdy_weirdie, не путаешь? SetWindowText и WM_SETTEXT - разные инструменты -------------------- "Гений всегда разумнее, чем умнее. Ум — это машина, разум — водитель этой машины." |
||||
|
|||||
| nerdy_weirdie |
|
|||
![]() Бывалый ![]() Профиль Группа: Участник Сообщений: 179 Регистрация: 16.1.2007 Репутация: нет Всего: нет |
Да, память мне изменила, это делается так:
|
|||
|
||||
| Gradov |
|
|||
|
Шустрый ![]() Профиль Группа: Участник Сообщений: 124 Регистрация: 31.10.2006 Репутация: нет Всего: 3 |
Это все конечно замечательно, но:
1) SetWindowText заменит весь текст, а мне надо вставить в текущую позицию кусок текста. 2) Если использовать EM_REPLACESEL, EM_SETSEL годится только для Edita а мне необходимо вставлять в ЛЮБОЙ компонент, позволяющий вводить текст. Скажем есть приложние MS Word, обыкновенный документ, вот в текущую позицию курсора на листе и надо вставить текст. Как это сделать? PS: хендл окна я знаю, он передаются в хук-функцию. Это сообщение отредактировал(а) Gradov - 3.5.2009, 20:01 |
|||
|
||||
| GremlinProg |
|
|||
|
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 2706 Регистрация: 9.8.2005 Где: Тюмень Репутация: 99 Всего: 106 |
word, exel - используют интерфейсную модель mso (MSOffice), которые так же документированы: http://msdn.microsoft.com/en-us/library/mi...Office.11).aspx
проще, конечно управлять документом с помощью OLE-автоматов (поиск в гугл по ключам: WORD OLE) а все остальное - это либо EDIT, либо RichEdit -------------------- "Гений всегда разумнее, чем умнее. Ум — это машина, разум — водитель этой машины." |
|||
|
||||
| Gradov |
|
|||
|
Шустрый ![]() Профиль Группа: Участник Сообщений: 124 Регистрация: 31.10.2006 Репутация: нет Всего: 3 |
Да это, конечно, решение. Но опять же персонально для Word, Excel и может быть остального оффиса. Но это не решает проблему других программ - браузеров, ICQ-клиентов и т.д. в которых также для ввода текста не используются стандартные Editы. |
|||
|
||||
| GremlinProg |
|
|||
|
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 2706 Регистрация: 9.8.2005 Где: Тюмень Репутация: 99 Всего: 106 |
ICQ под рукой нет, но есть QIP
так тут наследование (subclassing) от RichEdit, т.е. все сообщения GET/SET/REPLACETEXT работают как обычно, наследование - практически максимум, с чем ты можешь столкнуться в 90%, так что не переживай на счет браузера, тут не все так просто, но я не использую Punto Switcher, не знаю вставляет ли он текст блоком в поле, сгенерированное по HTML, проверь сам (хотя тут тоже есть масса интерфейсов, но уже с привязкой к конкретным браузерам) -------------------- "Гений всегда разумнее, чем умнее. Ум — это машина, разум — водитель этой машины." |
|||
|
||||
| Gradov |
|
|||
|
Шустрый ![]() Профиль Группа: Участник Сообщений: 124 Регистрация: 31.10.2006 Репутация: нет Всего: 3 |
Punto Switcher вставляет текст во все! Я еще не встречал ни одного приложения в чей контрол, позволяющий вводить текст он не вставлял бы. Вот бы на исходники его взглянуть... Есть еще вариант с буфером обмена, но я точно проверял: после встави текста Punto Switcher текущий текст буфера обмена не изменяется. Если предположить что он сначала сохраняет текст буфера обмена потом вставляет свой и восстанавливает,то это опять при большрм буферер обмена думаю слишком большое торможение. При маленьких текстах да, а если в буфере рисунок? Кстати может кто знает можно ли как-то использовать буфер обмена путем добавления туда данных с каким-нибудбь своим ключом, а потом вставки только своих данных. Или же буфер обмена уникален и вставив туда всего одну букву эта буква затрет все что там до этого было? |
|||
|
||||
| GremlinProg |
|
|||
|
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 2706 Регистрация: 9.8.2005 Где: Тюмень Репутация: 99 Всего: 106 |
специально, только что проверил работу Punto Switcher:
набрал "ghj" в редакторе оперы (это не окно, браузеры вообще не создают окна на теги textarea и input с типом text), предварительно поставив шпиёна на сообщения оперы в логе нет ни одного сообщения по работе с буферами и установкой текста, но есть сообщения keyup, keydown, char с кодами VK_BACK - стирание символа слева и соответственной установкой нового символа вывод: Punto Switcher использует только эмуляцию нажатия клавиш, что и позволяет ему вставлять все что угодно и куда угодно, т.е. он не копирует текст блоком вообще -------------------- "Гений всегда разумнее, чем умнее. Ум — это машина, разум — водитель этой машины." |
|||
|
||||
![]()
|
| Правила форума "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. |