Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Delphi: Для новичков > Вставить текст из буфера в чужую прогу???


Автор: WaReZMEN 19.10.2007, 07:25
Вообщем имеется текст в буфере нужно его вставить в то место где сейчас курсор (курсор в текстовом редакторе неважно в каком вообщем любом месте где можно вводить текст естественно в ту прогу что активна), все это происходит когда я нажимаю кнопки не ctrl+v а к примеру shift+backspace. Подскажите как сделать? smile 

Автор: Alix 19.10.2007, 08:28
may be you need WM_PASTE message?

Автор: skyboy 21.10.2007, 03:30
WaReZMEN, как подсказывает Alix, надо отправить сообщение.
по справке посмотри postMessage(только не в "Delphi help", а в "Windows SDK").
отправлять надо сообщение WM_PASTE.
Естественно, отправлять сообщение не всем подряд, а только активному окну. как искать активное окно не помню, так что поройся самостоятельно в Windows SDK на предемет "getActiveWindow" или  что-то в этом роде. 
Однако, даже если ты найдешь нуное окно и пошлешь ему сообщение, только отэтого окна и будет зависеть, обработает оно сообщение и вставит ли данные из буфера или нет.

Автор: VICTAR 21.10.2007, 05:32
Цитата(skyboy @  21.10.2007,  04:30 Найти цитируемый пост)
 как искать активное окно не помню

GetForegroundWindow

Добавлено через 3 минуты и 44 секунды
http://forum.vingrad.ru/forum/topic-177594.html#

Автор: WaReZMEN 22.10.2007, 08:40
Написал

Код

var
  h:HWND;
begin
H:=GetForegroundWindow;
//    H:=GetActiveWindow;
PostMessage(H,    WM_PASTE,0,0);

Никакой реакций 

Автор: Alix 22.10.2007, 10:34
Цитата(VICTAR @  21.10.2007,  06:32 Найти цитируемый пост)
Вот тут кое-что есть 

там как раз ничерта нет
Цитата(WaReZMEN @  22.10.2007,  09:40 Найти цитируемый пост)
Никакой реакций 

потому что посылать нужно не окну верхнего уровня, а непосредственно окну контрола. Пример:
Код
var
  h : hwnd;

begin
  h := GetForegroundWindow;
  h := FindWindowEx(h, 0, PChar('TEdit'), nil);
  SendMessage(h, WM_PASTE, 0, 0);
  ...

Для твоих целей надо только не брать первый попавшийся на форме TEdit (как я это делаю в примере), а брать активный. Как его найти мне неизвестно, я поднимал этот вопрос в теме указанной VICTAR'ом, мне не ответили.

Автор: WaReZMEN 22.10.2007, 14:13
Alix, Спасибо!!! как узнаеш даи знать smile

Автор: Alix 22.10.2007, 16:17
докладаюсь о результатах. Желаемого удалось достичь таким образом:
Код
var
  victim : HWND;
  victimControl : HWND;
  myId,
  threadId : DWORD;

  ...
      victim   := GetForegroundWindow;     // получаем текущее окно
      threadId := GetWindowThreadProcessId(victim, nil);  // его ...
      myId := GetWindowThreadProcessId(wnd, nil);          // ... и наш хэндл
      if AttachThreadInput(myId, threadId, true) then begin   // соединяемся )
        victimControl := GetFocus;         // ну а тут - просто получаем активный контрол и все просто
        SendMessage(victimControl, WM_PASTE, 0, 0);
        AttachThreadInput(myId, threadId, false);  // отсоединяемся
      end; 


Полный код программы в аттаче (висит в бэке, по ctrl+alt+f10 выходит, по ctrl+alt+f9 вставляет буфер в текущий контрол).

Автор: WaReZMEN 23.10.2007, 10:30
Alix,  Спасибо!!!!

Автор: WaReZMEN 23.10.2007, 11:12
Созрел другой вопрос а как скапировать выделеный текст по нажатию на кнопки к премеру теже ctrl+alt+f9 ?

Автор: Alix 23.10.2007, 11:14
WM_COPY
а так же есть WM_CUT и WM_CLEAR и, быть может пригодится, EM_UNDO

Автор: WaReZMEN 24.10.2007, 00:07
Alix, Спасибо! Чето сам и не подумал smile Ведь это просто smile

Автор: WaReZMEN 24.10.2007, 06:24
Все можно закрыть тему

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)