Скопируйте выделенный текст в буфер обмена в MSWord, OOWriter и т. Д. - PullRequest
0 голосов
/ 15 апреля 2019

У меня есть код на Delphi (но это не главное)

 hWindow := GetForegroundWindow;
 EditHandle := GetTopWindow(hWindow);
 SendMessage(EditHandle, WM_COPY, 0, 0);
 SClipboard := Clipboard.AsText;

Если этот код работал для Блокнота - все очень хорошо. Если другой, не простой редактор, выделенный текст не копируется в буфер обмена. Как я могу выполнить копирование текста в буфер обмена? Я подозреваю, что SendMessage не работает.

1 Ответ

0 голосов
/ 17 апреля 2019

Во-первых, не все верхние окна являются элементами редактирования.Таким образом, EditHandle непредсказуемо.

Тогда WM_COPY поддерживается только в поле редактирования или в поле со списком.То же самое касается WM_GETTEXT, они не поддерживают все окна.Вы не сможете изменить механизм обработки сообщений, если не являетесь владельцем Windows.

Однако есть обходной путь - имитируйте ввод с клавиатуры «Ctrl + C» в целевом окне.

//SetForegroundWindow(hWindow); Since hWindow is already a Foreground Window
keybd_event(VK_CONTROL, MapVirtualKey(VK_CONTROL, 0), 0, 0);    // Ctrl down
keybd_event(ord('C'), MapVirtualKey(ord('C'), 0), 0, 0);        // C down
keybd_event(ord('C'), MapVirtualKey(ord('C'), 0), KEYEVENTF_KEYUP, 0);     // C up
keybd_event(VK_CONTROL, MapVirtualKey(VK_CONTROL, 0), KEYEVENTF_KEYUP, 0); // Ctrl up

РЕДАКТИРОВАТЬ:

Поскольку keybd_event был заменен SendInput, вот пример C ++ для использования SendInput:

INPUT input[4] = {0};
input[0].type = input[1].type = input[2].type = input[3].type = INPUT_KEYBOARD;
input[0].ki.wVk = input[3].ki.wVk = VK_CONTROL;
input[0].ki.wScan = input[3].ki.wScan = MapVirtualKey(VK_CONTROL, MAPVK_VK_TO_VSC);
input[1].ki.wVk = input[2].ki.wVk = 'C';
input[1].ki.wScan = input[2].ki.wScan = MapVirtualKey('C', MAPVK_VK_TO_VSC);
input[2].ki.dwFlags = input[3].ki.dwFlags = KEYEVENTF_KEYUP; // there is no KEYEVENTF_KEYDOWN
SendInput(4, input, sizeof(INPUT));
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...