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

У меня есть строковая переменная. Теперь я хочу сохранить строковое значение в элементе управления в другом приложении без использования буфера обмена. Я хочу сделать это вручную.

Я думаю, что я должен использовать SendMessage (WM_SETTEXT). Какой способ вы предлагаете (с примером, пожалуйста)?


person Kermia    schedule 17.09.2011    source источник
comment
Зависит от другого приложения. Какое это приложение? На какой элемент управления в этом приложении вы ориентируетесь?   -  person David Heffernan    schedule 17.09.2011
comment
Итак, вы на самом деле не хотите ничего вставлять в строгом смысле, то есть с использованием буфера обмена?   -  person Andreas Rejbrand    schedule 17.09.2011
comment
Прежде всего, вам нужен дескриптор окна целевого элемента управления редактированием.   -  person Andreas Rejbrand    schedule 17.09.2011
comment
@ Дэвид, я не знаю. Это может быть любое стандартное приложение Windows.   -  person Kermia    schedule 17.09.2011
comment
У каждого приложения может быть свое решение. Каждый элемент управления в этом приложении может нуждаться в различной обработке.   -  person David Heffernan    schedule 17.09.2011
comment
@Andreas Очень многие приложения не используют элементы оконного редактирования для своих текстовых полей.   -  person David Heffernan    schedule 17.09.2011
comment
@David Несмотря на разные имена классов, когда вы нажимаете Ctrl+V , Ms Windows будет вставлять строки куда угодно. как это?   -  person Kermia    schedule 17.09.2011
comment
@Kermia Нет, это работает так. Вы нажимаете CTRL+V, и система синтезирует сообщения ввода с клавиатуры, которые помещаются в очередь ввода потока переднего плана. Затем насос сообщений, прикрепленный к этому потоку, обрабатывает эти нажатия клавиш. Это часто будет включать доставку сообщения WM_PASTE оконному элементу управления. Винда не вставляет. Приложение с фокусом ввода получает сообщение о том, что пользователь нажал CTRL+V, а затем выбирает чтение из буфера обмена, интерпретацию его содержимого и соответствующий ответ.   -  person David Heffernan    schedule 17.09.2011
comment
Так что у меня нет другого пути, кроме как с помощью Send-Keys. правильный?   -  person Kermia    schedule 17.09.2011
comment
Отправить ключи, на мой взгляд, самый надежный способ.   -  person David Heffernan    schedule 17.09.2011
comment
Какое приложение имеет фокус? ваш или тот, куда вы хотите вставить строку?   -  person Whiler    schedule 17.09.2011
comment
Название не имеет ничего общего с вопросом. Если вы хотите поместить ключи в поле редактирования, то буфер обмена и вставка не имеют к этому никакого отношения.   -  person Warren P    schedule 17.09.2011
comment
Название редактируется. Спасибо за ваши голоса:)   -  person Kermia    schedule 18.09.2011
comment
Проголосовал за, потому что вы отредактировали вопрос, что делает его более полезным для других людей, которые появятся позже. Я немного исправил ваш вопрос, чтобы он соответствовал новому названию. Надеюсь, все в порядке.   -  person Warren P    schedule 19.09.2011


Ответы (2)


Поскольку ваше приложение знает строку, которую оно должно отправить...

При необходимости вы можете установить фокус на целевое окно/приложение.

Затем вы обрабатываете каждый символ, содержащийся в вашей строке, для имитации нажатия клавиш. Что-то вроде этого (слишком просто, чтобы работать именно так, как вы ожидаете, но идея здесь... ;o)):

for i := 1 to Length(yourstring) do
begin
  keybd_event(Ord(yourstring[i]), 0, 0, 0);  // key down
  Sleep(10);
  keybd_event(Ord(yourstring[i]), 0, 0 or KEYEVENTF_KEYUP, 0); / key up
  Sleep(10);
end;

Если ваша строка в верхнем регистре,..., вам нужно имитировать сдвиг, ctrl,...

person Whiler    schedule 17.09.2011
comment
@Kermia это эквивалентно SendKeys, который у вас уже есть. - person David Heffernan; 17.09.2011
comment
@Marjan Я отправил привет коду, и результат был: h5/. Зачем? - person Kermia; 17.09.2011
comment
Он работает с HELLO.... не со строчными буквами... вам нужно управлять этим... msdn.microsoft.com/en-us/library/dd375731%28v=vs.85%29.aspx - person Whiler; 17.09.2011
comment
Есть ли готовый класс для обработки строчных и прописных символов? - person Kermia; 17.09.2011
comment
ИМО, это гораздо предпочтительнее, чем (ab) использование буфера обмена. - person Chris Thornton; 18.09.2011

Введите несколько байтовых символов с помощью keybd_event:

procedure InsertText(text:string);
var i:integer;
    j:integer;
    ch:byte;
    str:string;
begin
  i:=1;
  while i<=Length(text) do
  begin
    ch:=byte(text[i]);
    if Windows.IsDBCSLeadByte(ch) then
       begin
         Inc(i);
         str:=inttostr(MakeWord(byte(text[i]), ch));
         keybd_event(VK_MENU, MapVirtualKey(VK_MENU, 0), 0, 0);
         j:=1;
         while j<=Length(str) do
         begin
               keybd_event(96+strtoint(str[j]), MapVirtualKey(96+strtoint(str[j]), 0), 0, 0);
               keybd_event(96+strtoint(str[j]), MapVirtualKey(96+strtoint(str[j]), 0), 2, 0);
               j:=j+1;
         end;
         keybd_event(VK_MENU, MapVirtualKey(VK_MENU, 0), KEYEVENTF_KEYUP, 0);
       end
    else begin
           keybd_event(VkKeyScan(text[i]),0,0,0);
           keybd_event(VkKeyScan(text[i]),0,2,0);
         end;
    Inc(i);
  end;
end;
person diyism    schedule 25.03.2012