|
|
Регистрация Восстановить пароль |
Регистрация | Задать вопрос |
Заплачу за решение |
Новые сообщения |
Сообщения за день |
Расширенный поиск |
Правила |
Всё прочитано |
|
|
Опции темы | Поиск в этой теме |
30.05.2008, 17:42 | #1 |
Пользователь
Регистрация: 30.05.2008
Сообщений: 22
|
Вставка текста в чужое приложение
Необходимо уметь из своего приложения вставить некий текст в любое другое приложение, имеющее поле ввода текста.
Повесил Hook (WH_KEYBOARD), выудил нужное приложение (GetForegroundWindow), сделал ему GetCurrentThreadId + GetWindowThreadProcessId + AttachThreadInput + GetFocus и получил HWND нужного контрола, посылаю нужное сообщение (EM_REPLACESEL). Работает. НО не во всех приложениях. Не пашет, например, в Word, в контролах ввода в IE и т.п. Насколько я понимаю, не все контролы отрабатывают EM_REPLACESEL (не наследники TEdit). Внимание вопрос: как можно это обойти? P.S. Punto Switcher как-то с этим справляется. Или он делает WM_KEYDOWN и т.д.? WM_KEYDOWN не позволяет передавать ПРОИЗВОЛЬНЫЕ символы, а лишь виртуальные коды клавиш. Последний раз редактировалось MyasNick; 31.05.2008 в 02:53. |
31.05.2008, 01:39 | #2 |
Новичок
Джуниор
Регистрация: 18.01.2008
Сообщений: 1,720
|
Проблема Ворда и хуков уже несколько раз обсуждалась, не хочется повторяться, воспользуйтесь поиском по форуму (даже по разделу). Обязать какую-либо программу обрабатывать какое-либо сообщение так, как написано в документации и никак иначе, в принципе, никто не может, более того, игнорирование "левых" оконных сообщений - вполне разумное решение. Как обойти? Ну Вы же "закрепились" хуком в том процессе? Пробуйте менять оконную процедуру, для начала.
В том, что WM_KEYDOWN передаёт коды клавиш нет ничего удивительного - оно так и называется, для символов существует WM_CHAR. |
31.05.2008, 02:52 | #3 |
Пользователь
Регистрация: 30.05.2008
Сообщений: 22
|
Спасибо за наводку!
Спасибо за наводку!
По форумам, в т.ч. и этому, конечно же полазил, а данный раздел изучил полностью . Даже так - облазил столько, сколько осилил мозг. К сожалению, ничего путного для себя пока не нашел. Основная проблема в том, что текст должен вставляться в ЛЮБОЙ контрол, имеющий каретку (в пределах разумного, конечно). Попробую поковырять WM_CHAR, может что-то вырастет. У кого-нибудь есть предположения, как это реализовано в томже Punto? При его работе заметны прыжки каретки. Последний раз редактировалось MyasNick; 31.05.2008 в 02:54. |
31.05.2008, 22:04 | #4 |
Пользователь
Регистрация: 30.05.2008
Сообщений: 22
|
Помогло. Почти
Чтож, с WM_CHAR стало намного лучше. Практически во всех программах вставка символов заработала.
Пока непокоренными остались: основное поле поле ввода в Word, Firefox, IE после вставки нескольких символов вылетает напрочь. |
31.05.2008, 22:15 | #5 |
Новичок
Джуниор
Регистрация: 18.01.2008
Сообщений: 1,720
|
Пользуйтесь keybd_event или SendInput. А вылетает IE, скорее всего, из-за Вашего хука.
|
01.06.2008, 22:07 | #6 |
Пользователь
Регистрация: 30.05.2008
Сообщений: 22
|
IE7 вылетает при получении WM_CHAR
Неа, не на хуке. IE7 вылетает вот на чем:
SendMessage(GetFocus, WM_CHAR, wParam, lParam); при отправки символов в поле поиска справа вверху. Причем, не сразу, а только на 3-4 символе. Последний раз редактировалось MyasNick; 02.06.2008 в 00:14. |
02.06.2008, 00:44 | #7 |
Новичок
Джуниор
Регистрация: 18.01.2008
Сообщений: 1,720
|
|
02.06.2008, 00:51 | #8 |
Пользователь
Регистрация: 30.05.2008
Сообщений: 22
|
Из обработчика хука в приложении. Пробовал другие сообщения, вроде без проблем, а WM_CHAR вызывает глюк.
Она же возвращает Handle контрола, имеющего фокус ввода, а в SendMessage именно он и нужен. Или стоит делать через промежуточную HWND-переменную? |
02.06.2008, 00:56 | #9 | |
Новичок
Джуниор
Регистрация: 18.01.2008
Сообщений: 1,720
|
Цитата:
Нет, я не переменную имел в виду, а находится ли этот код в том же процессе (в эксплорере, видимо, в данном случае), что и окно с фокусом. Но, собственно, Вы на этот вопрос и ответили, а отправить сообщение "нулевому" окну - вещь вполне безобидная. |
|
02.06.2008, 01:20 | #10 |
Пользователь
Регистрация: 30.05.2008
Сообщений: 22
|
Роняет передача сообщения WM_CHAR, при передаче сообщения EM_REPLACESEL эксэпшн не возникает. К слову, исключение вызывает модуль AutoSuggestion
|
|
Похожие темы | ||||
Тема | Автор | Раздел | Ответов | Последнее сообщение |
Вставка текста в RichEdit | NoName_emaNoN | Компоненты Delphi | 4 | 03.05.2008 12:12 |
чужое приложение | Electrod | Win Api | 12 | 27.01.2008 17:04 |
Вставка текста | Pedro | Общие вопросы Delphi | 4 | 27.01.2008 10:27 |
! Вставка текста ! | ♠STO♠ | Общие вопросы Delphi | 2 | 30.08.2007 17:05 |
Как активировать чужое приложение | Hintman | Win Api | 3 | 30.04.2007 16:24 |