SendMessage WM_COPY не работает при отправке в chrome окно DELPHI - PullRequest
0 голосов
/ 24 марта 2020

Я пытаюсь решить эту проблему уже несколько недель. Я пытаюсь создать приложение в Delphi, которое работает в фоновом режиме, ловит любую горячую клавишу и выполняет Ctrl + c. Поэтому я ловил горячую клавишу, например, ALT + стрелка вправо, затем имитировал Ctrl + c и бросал команду в текущее окно.

Я заметил, что при попытке отправить команды Firefox как показано ниже:

SendMessage(FireFoxHandle, WM_COPY, 0, 0);
sleep(250);
CopiedText := ClipBoard.AsText;

Копирование прошло успешно, и я получил ожидаемый текст. Но как только я использовал ту же строку кодов для других windows, таких как chrome (chrome_widget_1) или блокнота, я ничего не могу получить. Итак, я попытался получить дочернее окно chrome и блокнота и попытаться отправить команду дочернему окну.

  1. Получил "Chrome Legacy Window" в качестве дочернего элемента Окно "chrome_widget_1", но когда я пытаюсь выделить текст на вкладке, имитируйте Ctrl + c, все еще не работающий.

  2. Найден пример здесь в stackoverflow для отправки wm_copy в Дочернее окно блокнота, которое является редактированием, как показано ниже:

ParentWindw := FindWindow('Notepad',nil);
if ParentWindow <> 0 then
begin
  ChildWindow := FindWindowEx(ParentWindow, 0, 'Edit', nil);
  SendMessage(ChildWindow, WM_COPY, 0, 0);
  sleep(250);
  CopiedText := ClipBoard.AsText;
end;

Код работает, но есть ли какой-нибудь динамический c способ определить дочернее окно, которое мне нужно использовать для команда wm_copy? Я спрашиваю не только о окне блокнота, но и о всех возможных окнах, которые можно использовать.

Или, в любом случае, я могу скопировать выделенный текст в любое окно программно в Delphi, в частности в xe2?

Я уже исследовал уже как sendinput, keyevents и попробовал их, но не повезло. У меня нет выбора, как заставить это работать.

Спасибо за любую помощь заранее.

Ответы [ 2 ]

0 голосов
/ 27 марта 2020

Код MouseAndKeyInput, который вы указали в принятом ответе, является просто обёрткой для SendInput() на Windows, о котором я говорил вам в комментариях, чтобы использовать 3 дня go. Вы можете (и должны) полностью избавиться от этих 5 .pas файлов и заменить эти 3 отдельных вызова метода KeyInput одним вызовом SendInput(). Он может отправлять все 4 клавишных ввода (Ctrl вниз, C вниз, C вверх, Ctrl вверх) атомарно за один раз (что важно, чтобы другие события не смешивались с ваши события), например:

var
  Inputs: array[0..3] of TInput;
begin
  ZeroMemory(@Inputs, SizeOf(Inputs));

  Sleep(250);

  Inputs[0].type := INPUT_KEYBOARD;
  Inputs[0].ki.wVk := VK_CONTROL;

  Inputs[1].type := INPUT_KEYBOARD;
  Inputs[1].ki.wVk := Ord('C');

  Inputs[2].type := INPUT_KEYBOARD;
  Inputs[2].ki.wVk := Ord('C');
  Inputs[2].ki.dwFlags := KEYEVENTF_KEYUP;

  Inputs[3].type := INPUT_KEYBOARD;
  Inputs[3].ki.wVk := VK_CONTROL;
  Inputs[3].ki.dwFlags := KEYEVENTF_KEYUP;

  SendInput(4, Inputs, SizeOf(TInput));

  Sleep(250);

  Memo1.Lines.Add(Clipboard.AsText);
end;

Вызов SendInput() с параметром cInputs, установленным в 1 (как KeyInput и MouseInput do), почти всегда ошибка на практике, и должно быть сделано только в редких ситуациях.

0 голосов
/ 27 марта 2020

Хорошо. Найденная проблема, связанная с моей, здесь Topi c: [решено] Имитировать нажатие Ctrl + c в активном приложении (Windows) . Один из людей предложил использовать «MouseAndKeyInput», который можно найти и загрузить здесь BGRA Controls . Внутри ссылки на скачивание будет найдено 5 файлов, а именно:

KeyInputIntf.pas
MouseAndKeyInput.pas
MouseInputIntf.pas
WinKeyInput.pas
WinMouseInput.pas

Добавил эти файлы в мой проект и объявил «MouseAndKeyInput» для использования в реализации моего проекта. Теперь в моей процедуре моделирования ctr c:

Sleep(250);

KeyInput.Apply([ssCtrl]);
KeyInput.Press('C');
KeyInput.Unapply([ssCtrl]);

Sleep(250);

Memo1.Lines.Add(Clipboard.AsText);

И текст, который появляется в заметке, - это текст или строки, которые я выделил из текущего активного приложения, над которым я работал в данный момент. .

Смог сделать это на вкладке и блокноте Google chrome, а также в любом другом приложении.

Спасибо всем, кто здесь помог!

...