Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Низкоуровневое программирование > Win Api
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 30.05.2008, 17:42   #1
MyasNick
Пользователь
 
Аватар для MyasNick
 
Регистрация: 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.
MyasNick вне форума Ответить с цитированием
Старый 31.05.2008, 01:39   #2
B_N
Новичок
Джуниор
 
Регистрация: 18.01.2008
Сообщений: 1,720
По умолчанию

Проблема Ворда и хуков уже несколько раз обсуждалась, не хочется повторяться, воспользуйтесь поиском по форуму (даже по разделу). Обязать какую-либо программу обрабатывать какое-либо сообщение так, как написано в документации и никак иначе, в принципе, никто не может, более того, игнорирование "левых" оконных сообщений - вполне разумное решение. Как обойти? Ну Вы же "закрепились" хуком в том процессе? Пробуйте менять оконную процедуру, для начала.

В том, что WM_KEYDOWN передаёт коды клавиш нет ничего удивительного - оно так и называется, для символов существует WM_CHAR.
B_N вне форума Ответить с цитированием
Старый 31.05.2008, 02:52   #3
MyasNick
Пользователь
 
Аватар для MyasNick
 
Регистрация: 30.05.2008
Сообщений: 22
Радость Спасибо за наводку!

Цитата:
Сообщение от B_N Посмотреть сообщение
для символов существует WM_CHAR.
Спасибо за наводку!

По форумам, в т.ч. и этому, конечно же полазил, а данный раздел изучил полностью . Даже так - облазил столько, сколько осилил мозг. К сожалению, ничего путного для себя пока не нашел. Основная проблема в том, что текст должен вставляться в ЛЮБОЙ контрол, имеющий каретку (в пределах разумного, конечно). Попробую поковырять WM_CHAR, может что-то вырастет.

У кого-нибудь есть предположения, как это реализовано в томже Punto? При его работе заметны прыжки каретки.

Последний раз редактировалось MyasNick; 31.05.2008 в 02:54.
MyasNick вне форума Ответить с цитированием
Старый 31.05.2008, 22:04   #4
MyasNick
Пользователь
 
Аватар для MyasNick
 
Регистрация: 30.05.2008
Сообщений: 22
Восклицание Помогло. Почти

Чтож, с WM_CHAR стало намного лучше. Практически во всех программах вставка символов заработала.

Пока непокоренными остались: основное поле поле ввода в Word, Firefox, IE после вставки нескольких символов вылетает напрочь.
MyasNick вне форума Ответить с цитированием
Старый 31.05.2008, 22:15   #5
B_N
Новичок
Джуниор
 
Регистрация: 18.01.2008
Сообщений: 1,720
По умолчанию

Пользуйтесь keybd_event или SendInput. А вылетает IE, скорее всего, из-за Вашего хука.
B_N вне форума Ответить с цитированием
Старый 01.06.2008, 22:07   #6
MyasNick
Пользователь
 
Аватар для MyasNick
 
Регистрация: 30.05.2008
Сообщений: 22
Восклицание IE7 вылетает при получении WM_CHAR

Цитата:
Сообщение от B_N Посмотреть сообщение
вылетает IE, скорее всего, из-за Вашего хука.
Неа, не на хуке. IE7 вылетает вот на чем:

SendMessage(GetFocus, WM_CHAR, wParam, lParam); при отправки символов в поле поиска справа вверху. Причем, не сразу, а только на 3-4 символе.

Последний раз редактировалось MyasNick; 02.06.2008 в 00:14.
MyasNick вне форума Ответить с цитированием
Старый 02.06.2008, 00:44   #7
B_N
Новичок
Джуниор
 
Регистрация: 18.01.2008
Сообщений: 1,720
По умолчанию

Цитата:
Сообщение от MyasNick Посмотреть сообщение
Неа, не на хуке. IE7 вылетает вот на чем:

SendMessage(GetFocus, WM_CHAR, wParam, lParam); при отправки символов в поле поиска справа вверху. Причем, не сразу, а только на 3-4 символе.
Откуда это вызывается? Вы уверены в том, что первым параметром нужна GetFocus?
B_N вне форума Ответить с цитированием
Старый 02.06.2008, 00:51   #8
MyasNick
Пользователь
 
Аватар для MyasNick
 
Регистрация: 30.05.2008
Сообщений: 22
По умолчанию

Цитата:
Сообщение от B_N Посмотреть сообщение
Откуда это вызывается?
Из обработчика хука в приложении. Пробовал другие сообщения, вроде без проблем, а WM_CHAR вызывает глюк.

Цитата:
Сообщение от B_N Посмотреть сообщение
Вы уверены в том, что первым параметром нужна GetFocus?
Она же возвращает Handle контрола, имеющего фокус ввода, а в SendMessage именно он и нужен. Или стоит делать через промежуточную HWND-переменную?
MyasNick вне форума Ответить с цитированием
Старый 02.06.2008, 00:56   #9
B_N
Новичок
Джуниор
 
Регистрация: 18.01.2008
Сообщений: 1,720
По умолчанию

Цитата:
Сообщение от MyasNick Посмотреть сообщение
Из обработчика хука в приложении. Пробовал другие сообщения, вроде без проблем, а WM_CHAR вызывает глюк.
Ну так я об этом и говорю. Эксплорер "роняет" Ваш хук, а чем именно - нужно смотреть по коду.

Цитата:
Сообщение от MyasNick Посмотреть сообщение
Она же возвращает Handle контрола, имеющего фокус ввода, а в SendMessage именно он и нужен. Или стоит делать через промежуточную HWND-переменную?
Нет, я не переменную имел в виду, а находится ли этот код в том же процессе (в эксплорере, видимо, в данном случае), что и окно с фокусом. Но, собственно, Вы на этот вопрос и ответили, а отправить сообщение "нулевому" окну - вещь вполне безобидная.
B_N вне форума Ответить с цитированием
Старый 02.06.2008, 01:20   #10
MyasNick
Пользователь
 
Аватар для MyasNick
 
Регистрация: 30.05.2008
Сообщений: 22
По умолчанию

Цитата:
Сообщение от B_N Посмотреть сообщение
Ну так я об этом и говорю. Эксплорер "роняет" Ваш хук, а чем именно - нужно смотреть по коду.
Роняет передача сообщения WM_CHAR, при передаче сообщения EM_REPLACESEL эксэпшн не возникает. К слову, исключение вызывает модуль AutoSuggestion
MyasNick вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Вставка текста в 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