|
|
Регистрация | << Правила форума >> | FAQ | Пользователи | Календарь | Поиск | Сообщения за сегодня | Все разделы прочитаны |
|
Опции темы | Поиск в этой теме | Опции просмотра |
#1
|
|||
|
|||
Буфер обмена winapi
Задача: послать стороннему приложению, (в данном случае игра на directx) в окно ввода, комбинацию клавиш ctrl + v, перед этим скопировав в буфер обмена какой нибудь текст. При этом приложение находится в свернутом состоянии, то есть не получает фокуса. С этим проблем нет, вставка текста работает. Только вот вставляется не тот текст который я копирую в буфер обмена, а тот текст который был в буфере до этого. То есть приложение по непонятно каким причинам игнорирует последнее изменение буфера обмена и в поле ввода копируется текст как будто буфер обмена не изменялся. Как решить эту проблему и заставить приложение копировать текст который я сам помещаю в буфер обмена.
Ниже прилагаю часть кода которая непосредственно отвечает за вставку текста из буфера обмена. Код:
procedure SendMsg; begin // копируем содержимое memo1 в буфер обмена Clipboard.Clear; Form1.Memo1.SelectAll; Form1.Memo1.CopyToClipboard; // кликаем в поле ввода в окне другой программы для того чтобы оно стало активным для ввода PostMessage(Handler, WM_LBUTTONDOWN, MK_LBUTTON, MAKELparam(EditX, EditY)); sleep(100); PostMessage(Handler, WM_LBUTTONUP, 0, MAKELparam(EditX, EditY)); sleep(1000); // посылаем окну комбинацию ctrl + v keybd_event(VK_CONTROL,0,0,0); sleep(100); PostMessage(Handler, WM_KEYDOWN, Ord('V'), $002F0001); sleep(100); PostMessage(Handler, WM_KEYUP, Ord('V'), $C02F0001); sleep(100); keybd_event(VK_CONTROL,0,KEYEVENTF_KEYUP,0); sleep(100); // нажимаем ентер PostMessage(Handler, WM_KEYDOWN, VK_RETURN, $00000001); sleep(100); PostMessage(Handler, WM_KEYUP, VK_RETURN, $C0000001); sleep(100); end; Последний раз редактировалось PonuHunter, 20.04.2013 в 18:31. |
#2
|
||||
|
||||
Я бы делал на винапи все сразу. Пример на плюсах:
Код:
if(OpenClipboard(0)) { HGLOBAL hgBuffer; wchar_t *chBuffer; EmptyClipboard(); hgBuffer= GlobalAlloc(GMEM_DDESHARE, source.length() * 2 + 2); chBuffer= (wchar_t *)GlobalLock(hgBuffer); wcscpy(chBuffer, source.data()); GlobalUnlock(hgBuffer); SetClipboardData(CF_UNICODETEXT, hgBuffer); CloseClipboard(); } jmp $ ; Happy End! The Cake Is A Lie. |
#3
|
|||
|
|||
Цитата:
Пробовал копировать в буфер обмена с помощью винапи, как в твоем примере - результат тот же, то есть никакого результата. ( |
#4
|
||||
|
||||
а так тоже не прокатывает?
Код:
Clipboard.Text := 'blabla' — Как тебя понимать? — Понимать меня не обязательно. Обязательно меня любить и кормить вовремя. На Delphi, увы, больше не программирую. Рекомендуемая литература по программированию |
#5
|
|||
|
|||
Цитата:
У объекта clipboard нет метода text, но это неважно. Проблема не в способе помещения текста в буфер обмена, текст благополучно туда помещается. Проблема в том что когда я пытаюсь копипастнуть его в программу то копируется текст тот который был до того как я изменил содержимое буфера обмена. |
#6
|
||||
|
||||
Цитата:
Код:
type TForm1 = class(TForm) ... procedure SendMsg; ... procedure Form1.SendMsg; begin // копируем содержимое memo1 в буфер обмена Memo1.SelectAll; Memo1.CopyToClipboard; // кликаем в поле ввода в окне другой программы для того чтобы оно стало активным для ввода PostMessage(Handler, WM_LBUTTONDOWN, MK_LBUTTON, MAKELparam(EditX, EditY)); sleep(100); PostMessage(Handler, WM_LBUTTONUP, 0, MAKELparam(EditX, EditY)); sleep(1000); // посылаем окну комбинацию ctrl + v keybd_event(VK_CONTROL, 0, KEYEVENTF_EXTENDEDKEY, 0); keybd_event(86, 0, KEYEVENTF_EXTENDEDKEY, 0); keybd_event(VK_CONTROL, 0, KEYEVENTF_EXTENDEDKEY or KEYEVENTF_KEYUP, 0); keybd_event(86, 0, KEYEVENTF_EXTENDEDKEY or KEYEVENTF_KEYUP, 0); // нажимаем ентер PostMessage(Handler, WM_KEYDOWN, VK_RETURN, $00000001); sleep(100); PostMessage(Handler, WM_KEYUP, VK_RETURN, $C0000001); sleep(100); end; Я не понял Вашего вопроса, но всё же Вам на него отвечу! |
#7
|
|||
|
|||
Цитата:
Допустим до выполнения моей программы в буфере был текст: 'blablabla', а в процессе выполнения программа помещает в буфер текст 'hahaha'. В итоге, в результате выполнения программы я получаю текст 'blablabla' в окне ввода приложения которому я посылаю комбинацию ctrl + v, а если я сам вставляю текст в скажем блокнот то я получаю 'hahaha'. То есть текст находится в буфере, а значит проблема явно не в способе его помещения туда. Цитата:
|
#8
|
||||
|
||||
Советую бросить на форму ещё одну мемку и проверить вставку вот так
Код:
Memo1.SelectAll; Memo1.CopyToClipboard; memo2.Clear; Memo2.SetFocus; keybd_event(VK_CONTROL, 0, KEYEVENTF_EXTENDEDKEY, 0); keybd_event(86, 0, KEYEVENTF_EXTENDEDKEY, 0); keybd_event(VK_CONTROL, 0, KEYEVENTF_EXTENDEDKEY or KEYEVENTF_KEYUP, 0); keybd_event(86, 0, KEYEVENTF_EXTENDEDKEY or KEYEVENTF_KEYUP, 0); // и дальше по коду Я не понял Вашего вопроса, но всё же Вам на него отвечу! |
#9
|
||||
|
||||
А если делать задержку до отправки Ctrl+V?
|
#10
|
|||
|
|||
Цитата:
Цитата:
Я просто заменил хендлер игры на хендлер окна ввода блокнота и в блокноте все отлично работает, но в игру он копирует старое значение буфера обмена. Последний раз редактировалось M.A.D.M.A.N., 20.04.2013 в 20:52. Причина: MAD: Пользуемся кнопкой "Редактировать", не устраиваем из форума чат. |
#11
|
||||
|
||||
Наверное действует защита от ClipBoard-а, я так в своих программах делал.
Je venus de nulle part 55.026263 с.ш., 73.397636 в.д. |