Модераторы: feodorv, GremlinProg, xvr, Fixin
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Как вставить текст в компонент на любой форме?? 
:(
    Опции темы
Gradov
Дата 3.5.2009, 18:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 124
Регистрация: 31.10.2006

Репутация: нет
Всего: 3



Привет. Есть такая задача. Надо вставить текст в любой компонент, который поддерживает ввод текста на любой форме. Хук на клаву я ставлю - все ok! Также могу посимвольно ввести текст в компонент, а вот полностью вставить текст не знаю как. Это актуально для больших текстов из 1000 символов и более. Если по одному символу вставлять, то получается ... фигня в общем - очень медленно.

Можно, конечно, использовать буфер обмена для этого, но тогда затрется ведь то что в clipboard находится - а это уже не годится, так как пользователь может использовать буфер обмена для своих целей.

Вот к примеру Punto Switcher это же умудряется делать. Он вставляет текст замены очень быстро, т.е. точно не посимвольно а сразу целиком. Как же это у них реализовано?
PM MAIL   Вверх
nerdy_weirdie
Дата 3.5.2009, 18:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 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
PM MAIL   Вверх
586
Дата 3.5.2009, 19:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2243
Регистрация: 8.5.2006

Репутация: 39
Всего: 146



Цитата(nerdy_weirdie @  3.5.2009,  19:17 Найти цитируемый пост)
"However, SetWindowText cannot change the text of a control in another application." - суеверная брехня.

А у меня были проблемы при вызове GetWindowText(WindowFromPoint(...), ...); - у некоторых объектов не определялся текст, а с SendMessage(WindowFromPoint(...), WM_GETTEXT, ...) нормально работает.

Добавлено через 52 секунды
Windows XP SP2
PM   Вверх
GremlinProg
Дата 3.5.2009, 19:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 2706
Регистрация: 9.8.2005
Где: Тюмень

Репутация: 99
Всего: 106



586, так и есть

Цитата(SetWindowText @ MSDN)

To set the text of a control in another process, send the WM_SETTEXT message directly instead of calling SetWindowText.

Цитата(GetWindowText @ MSDN)

To retrieve the text of a control in another process, send a WM_GETTEXT message directly instead of calling GetWindowText.


nerdy_weirdie, не путаешь?
SetWindowText и WM_SETTEXT - разные инструменты


--------------------
"Гений всегда разумнее, чем умнее. Ум — это машина, разум — водитель этой машины."
PM WWW ICQ   Вверх
nerdy_weirdie
Дата 3.5.2009, 19:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 179
Регистрация: 16.1.2007

Репутация: нет
Всего: нет



Да, память мне изменила, это делается так:
Код

::SendMessage(hCtrl, EM_SETSEL, (WPARAM)0, (LPARAM)-1);
::SendMessage(hCtrl, EM_REPLACESEL, (WPARAM)FALSE, (LPARAM)((LPCSTR)(szNewText)));

PM MAIL   Вверх
Gradov
Дата 3.5.2009, 20:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 124
Регистрация: 31.10.2006

Репутация: нет
Всего: 3



Это все конечно замечательно, но:
1) SetWindowText заменит весь текст, а мне надо вставить в текущую позицию кусок текста.

2) Если использовать EM_REPLACESEL, EM_SETSEL годится только для Edita а мне необходимо вставлять в ЛЮБОЙ компонент, позволяющий вводить текст. Скажем есть приложние MS Word, обыкновенный документ, вот в текущую позицию курсора на листе и надо вставить текст. Как это сделать?

PS: хендл окна я знаю, он передаются в хук-функцию.

Это сообщение отредактировал(а) Gradov - 3.5.2009, 20:01
PM MAIL   Вверх
GremlinProg
Дата 3.5.2009, 20:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 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


--------------------
"Гений всегда разумнее, чем умнее. Ум — это машина, разум — водитель этой машины."
PM WWW ICQ   Вверх
Gradov
Дата 3.5.2009, 22:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 124
Регистрация: 31.10.2006

Репутация: нет
Всего: 3



Цитата(GremlinProg @  3.5.2009,  20:18 Найти цитируемый пост)
word, exel - используют интерфейсную модель mso (MSOffice), которые так же документированы: http://msdn.microsoft.com/en-us/library/mi...Office.11).aspxпроще, конечно управлять документом с помощью OLE-автоматов (поиск в гугл по ключам: WORD OLE)


Да это, конечно, решение. Но опять же персонально для Word, Excel и может быть остального оффиса. Но это не решает проблему других программ - браузеров, ICQ-клиентов и т.д. в которых также для ввода текста не используются стандартные Editы. 
PM MAIL   Вверх
GremlinProg
Дата 4.5.2009, 00:46 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 2706
Регистрация: 9.8.2005
Где: Тюмень

Репутация: 99
Всего: 106



ICQ под рукой нет, но есть QIP
так тут наследование (subclassing) от RichEdit, т.е. все сообщения GET/SET/REPLACETEXT работают как обычно,
наследование - практически максимум, с чем ты можешь столкнуться в 90%, так что не переживай

на счет браузера, тут не все так просто, но я не использую Punto Switcher, не знаю вставляет ли он текст блоком в поле, сгенерированное  по HTML, проверь сам (хотя тут тоже есть масса интерфейсов, но уже с привязкой к конкретным браузерам)


--------------------
"Гений всегда разумнее, чем умнее. Ум — это машина, разум — водитель этой машины."
PM WWW ICQ   Вверх
Gradov
Дата 7.5.2009, 13:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 124
Регистрация: 31.10.2006

Репутация: нет
Всего: 3



Цитата(GremlinProg @  4.5.2009,  00:46 Найти цитируемый пост)
на счет браузера, тут не все так просто, но я не использую Punto Switcher, не знаю вставляет ли он текст блоком в поле, сгенерированное  по HTML, проверь сам (хотя тут тоже есть масса интерфейсов, но уже с привязкой к конкретным браузерам)


Punto Switcher вставляет текст во все! Я еще не встречал ни одного приложения в чей контрол, позволяющий вводить текст он не вставлял бы.
Вот бы на исходники его взглянуть...

Есть еще вариант с буфером обмена, но я точно проверял: после встави текста Punto Switcher текущий текст буфера обмена не изменяется. Если предположить что он сначала сохраняет текст буфера обмена потом вставляет свой и восстанавливает,то это опять при большрм буферер обмена думаю слишком большое торможение. При маленьких текстах да, а если в буфере рисунок?

Кстати может кто знает можно ли как-то использовать буфер обмена путем добавления туда данных с каким-нибудбь своим ключом,  а потом вставки только своих данных. Или же буфер обмена уникален и вставив туда всего одну букву эта буква затрет все что там до этого было?

PM MAIL   Вверх
GremlinProg
Дата 7.5.2009, 14:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 2706
Регистрация: 9.8.2005
Где: Тюмень

Репутация: 99
Всего: 106



специально, только что проверил работу Punto Switcher:
набрал "ghj" в редакторе оперы (это не окно, браузеры вообще не создают окна на теги textarea и input с типом text), предварительно поставив шпиёна на сообщения оперы

в логе нет ни одного сообщения по работе с буферами и установкой текста, но есть сообщения keyup, keydown, char с кодами VK_BACK - стирание символа слева и соответственной установкой нового символа

вывод: Punto Switcher использует только эмуляцию нажатия клавиш, что и позволяет ему вставлять все что угодно и куда угодно, т.е. он не копирует текст блоком вообще


--------------------
"Гений всегда разумнее, чем умнее. Ум — это машина, разум — водитель этой машины."
PM WWW ICQ   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "C/C++: Системное программирование и WinAPI"
Fixin
GremlinProg
xvr
feodorv
  • Большое количество информации и примеров с использованием функций WinAPI можно найти в MSDN
  • Описание сообщений, уведомлений и примеров с использованием компонент WinAPI (BUTTON, EDIT, STATIC, и т.п.), можно найти в MSDN Control Library
  • Непосредственно, перед созданием новой темы, проверьте заголовок и удостоверьтесь, что он отражает суть обсуждения.
  • После заполнения поля "Название темы", обратите внимание на наличие и содержание панели "А здесь смотрели?", возможно Ваш вопрос уже был решен.
  • Приводите часть кода, в которой предположительно находится проблема или ошибка.
  • Если указываете код, пользуйтесь тегами [code][/code], или их кнопочными аналогами.
  • Если вопрос решен, воспользуйтесь соответствующей ссылкой, расположенной напротив названия темы.
  • Один топик - один вопрос!
  • Перед тем как создать тему - прочтите это .

На данный раздел распространяются Правила форума и Правила раздела С++:Общие вопросы .


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Chipset, Step, Fixin, GremlinProg, xvr. feodorv.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Системное программирование и WinAPI | Следующая тема »


 




[ Время генерации скрипта: 0.0527 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.