Карта сайтаСсылкиКонтакты

Хостинг


Как послать символ в другое приложение

PDF Печать
Статьи

Для того, чтобы отправить символ в другое приложение из Вашего нужно проделать ряд операций. Сначала нужно узнать идентификатор окна чужого приложения. Затем находим идентификатор поля ввода или текстового поля. И наконец, отправляем символ при помощи SendMessage.

Как послать символ другому приложению

Код, который при нажатии на кнопку отправляет букву А в Блокнот Windows. Блокнот должен быть запущен.


procedure TForm1.btnSendCharClick(Sender: TObject);
var
  wnd: HWND;
  child: integer;
begin
  { Находим главное окно приложения }
  wnd:= FindWindow('Notepad', nil);
  { Находим поле ввода текста }
  child:= ChildWindowFromPoint(wnd, point(50, 50));
  { Посылаем символ в поле ввода (букву А) }
  SendMessage(child, WM_CHAR, Ord('A'), 0);
end;

Пример с отправкой целой строки и установкой курсора в заданную позицию:


procedure TForm1.Button1Click(Sender: TObject);
var
  wnd: HWND;
  child: integer;
  s:string;
begin
  s:= 'Any text...';
  { Находим главное окно приложения }
  wnd:= FindWindow('Notepad', nil);
  { Находим поле ввода текста }
  child:= ChildWindowFromPoint(wnd, point(50, 50));
  //SendMessage(child,EM_SETSEL,5,5);       // установить курсор в заданную позицию
  SendMessage(child,EM_REPLACESEL,10,lparam(PChar(s))); // 10-позиция курсора,s-строка
  { Посылаем символ в поле ввода (букву А) }
//  SendMessage(child, WM_CHAR, Ord('A'), 0);
end;

 

Комментарии   

 
0 #1 юрий 04.04.2015 11:12
Вопрос следующий,в Вашей программе А вставляется в любой открытый блокнот,
потому что второе значение в FindWindow = nil , я обозвал блокнот "Prilojenie"
вставил это заглавие в
FindWindow('Not epad','Prilojen ie');
Но дескриптор такого окна не находится
Цитировать
 
 
0 #2 Serge 04.04.2015 21:48
Все дело в том, что передавать нужно заголовок полностью, например, 'Prilojenie — Блокнот'
Цитировать
 
 
0 #3 юрий 04.04.2015 22:46
Спасибо за поддержку Уважаемый Serge,еще вопросы есть
1 функция ChildWindowFrom Point(wnd, point(50, 50)) похоже у меня не работает
так как символ вставляется всегда в первую строку на первое место независимо от чисел в Point
2 как передать целую строку, я пока мудрю
и передаю посимвольно
var s: String;
s:= 'Привет';
for i:= 0 to Length(s) do
SendMessage(chi ld, WM_CHAR, Ord(s), 0);
Цитировать
 
 
0 #4 Serge 05.04.2015 00:58
Ну, во-первых, ChildWindowFrom Point просто ищет дочернее окно по координатам.
2. Чтобы вставить текст в заданную позицию нужно использовать SendMessage(child,EM_REPLACESEL,10,lparam(PChar(s)));
где 10 - это позиция, в которую нужно вставить текст, а s- переменная типа string, в которой хранится текст, который нужно вставить.
Следовательно SendMessage с WM_CHAR убрать из программы.
Цитировать
 
 
0 #5 юрий 05.04.2015 05:33
Спасибо за поддержку Уважаемый Serge,
еще глобальный вопрос
где можно взять описание функции
SendMessage,ее констант EM_REPLACESEL и
прочих ,кажется из=за них можно менять передаваемые параметры
Цитировать
 
 
0 #6 Serge 05.04.2015 09:57
Все описания API функций и их констант в MSDN Windows, например: https://msdn.microsoft.com/ru-ru/library/windows/desktop/bb761633(v=vs.85).aspx
Цитировать
 
 
0 #7 юрий 06.04.2015 14:20
Цитирую Serge:
Ну, во-первых, ChildWindowFromPoint просто ищет дочернее окно по координатам.
2. Чтобы вставить текст в заданную позицию нужно использовать SendMessage(child,EM_REPLACESEL,10,lparam(PChar(s)));
где 10 - это позиция, в которую нужно вставить текст, а s- переменная типа string, в которой хранится текст, который нужно вставить.


Ругается на lpatam ,пишет "необъявленный
идентификатор"
Цитировать
 
 
0 #8 юрий 06.04.2015 14:29
еще курсор в заданную позицию не
устанавливается с помощью SendMessage(chi ld,EM_SETSEL,5, 5);
посылал в Блокнот просто букву 'A'
всегда зависит от реального положения
курсора а не от установленного в
SendMessage(chi ld,EM_SETSEL,5, 5);
Цитировать
 
 
0 #9 Serge 08.04.2015 17:38
Цитирую юрий:
еще курсор в заданную позицию не
устанавливается с помощью SendMessage(child,EM_SETSEL,5,5);
посылал в Блокнот просто букву 'A'
всегда зависит от реального положения
курсора а не от установленного в
SendMessage(child,EM_SETSEL,5,5);

Верно, нужно сначала послать сообщение EM_SETSEL,0,0.
Цитировать
 
 
0 #10 юрий 08.04.2015 18:18
Спасибо за поддержку Уважаемый Serge
Цитировать
 

Добавить комментарий


Защитный код
Обновить