Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Общие вопросы Delphi
Регистрация

Восстановить пароль

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 13.08.2013, 23:25   #1
admin-one
Пользователь
 
Регистрация: 14.07.2012
Сообщений: 31
По умолчанию КопиПаст или как вставить текст в нужное место

Добрый день , возникла такая проблемка , нужно сделать что то вроде этого :
к примеру в edit1 есть текст , мне нужно чтоб этот текст попал туда где находится курсор , к примеру курсор мигает в поле для поиска на сайте и мне нужно чтоб в это место попал текст из edit1 . кто то знает как это сделать ? и все это должно быть программно ... post,get запросы НЕ предлагать , нужно чтоб все происходило в реальном времени ... пож очень нужно , заранее всем спасибо

иными словами:
Как определить в каком элементе формы находится курсор(для текстовых полей ввода)?
Например, чтобы узнать вставлять текст в этот элемент или нет
и если надо вставить туда текст

Последний раз редактировалось admin-one; 13.08.2013 в 23:36.
admin-one вне форума Ответить с цитированием
Старый 14.08.2013, 00:08   #2
zumm
БохЪ
Форумчанин
 
Аватар для zumm
 
Регистрация: 30.09.2009
Сообщений: 724
По умолчанию

Ну, все довольно просто. Для начала, нужно получить Handle окна на котором стоит фокус ввода. Для этого нужно пройтись по всем существующим окнам и проверить если у них фокус. Если фокус установлен, можно смело вписывать текст в это окно:

Код:
const
  SomeText = 'SomeText';
  
var
  MainProcessID: DWORD;
  
...

function CheckWindow(const AHandle: THandle; const AParam: LParam): Boolean;
var
  ProcessID: DWORD;
  HandleFocusedWindow: THandle;
begin
  ProcessID := GetWindowThreadProcessID(AHandle, nil); 

  AttachThreadInput(ProcessID, AParam, True); 
  HandleFocusedWindow := GetFocus(); 
  AttachThreadInput(ProcessID, AParam, False); 

  Result := HandleFocusedWindow <> 0;
  
  if Result then
  begin
    SetWindowText(HandleFocusedWindow, PChar(SomeText)); 
  end;
end;

...

begin 
  MainProcessID := GetWindowThreadProcessId(Handle, nil); 
  EnumWindows(@CheckWindow, LParam(MainProcessID)); 
end;
В планах порабощение вселенной...
zumm вне форума Ответить с цитированием
Старый 14.08.2013, 00:51   #3
eoln
Старожил
 
Аватар для eoln
 
Регистрация: 26.04.2008
Сообщений: 2,645
По умолчанию

Может быть есть способ другой... Какая конечная цель программы? Быстрый поиск на просматриваемой странице чего-либо? А обычные ctrl-c/ctrl-v не подойдут?
Один из вариантов - хуком или просто по таймеру или ещё как искать активное окно (см например GetForegroundWindow), затем перебор элементов окна (см FindWindow/FindWindowEx или EnumChildWindows), затем вставка текста (см SendMessage+WM_SETTEXT/WM_PASTE или SetWindowText).

НО! Тут есть куча (большая) неприятностей. Например, текстовые поля могут иметь разные классы - какой-нибудь TMyEdit. И если это ещё можно определить по свойствам компонента, то проблему с текстовыми полями которые не являются оконными компонентами таким способом решить нельзя (это касается и многих браузеров). Обойти, конечно, можно - имитация ctrl-v через буфер обмена, но нет гарантии что курсор в поле ввода. Далее ещё надо будет предусмотреть ситуацию исключающую повторное копирование текста - тут можно приципить код к "горячей клавише". В итоге приходим к тому с чего начали (хотя чуть более быстрее).
eoln вне форума Ответить с цитированием
Старый 14.08.2013, 10:59   #4
admin-one
Пользователь
 
Регистрация: 14.07.2012
Сообщений: 31
По умолчанию

Цитата:
Сообщение от zumm Посмотреть сообщение
Ну, все довольно просто. Для начала, нужно получить Handle окна на котором стоит фокус ввода. Для этого нужно пройтись по всем существующим окнам и проверить если у них фокус. Если фокус установлен, можно смело вписывать текст в это окно:

Код:
const
  SomeText = 'SomeText';
  
var
  MainProcessID: DWORD;
  
...

function CheckWindow(const AHandle: THandle; const AParam: LParam): Boolean;
var
  ProcessID: DWORD;
  HandleFocusedWindow: THandle;
begin
  ProcessID := GetWindowThreadProcessID(AHandle, nil); 

  AttachThreadInput(ProcessID, AParam, True); 
  HandleFocusedWindow := GetFocus(); 
  AttachThreadInput(ProcessID, AParam, False); 

  Result := HandleFocusedWindow <> 0;
  
  if Result then
  begin
    SetWindowText(HandleFocusedWindow, PChar(SomeText)); 
  end;
end;

...

begin 
  MainProcessID := GetWindowThreadProcessId(Handle, nil); 
  EnumWindows(@CheckWindow, LParam(MainProcessID)); 
end;

Этот код работает , но только не там где мне нужно , мне нужно чтоб работал на всех приложениях , будь то браузер , текстовик ,ворд , паинт и т.д , а этот только на моем приложении ....
есть еще идеи ?
admin-one вне форума Ответить с цитированием
Старый 14.08.2013, 11:57   #5
zumm
БохЪ
Форумчанин
 
Аватар для zumm
 
Регистрация: 30.09.2009
Сообщений: 724
По умолчанию

admin-one, этот код должен работать на любом приложении. Конечно же, при условии, что это приложение использует оконные компоненты.
В планах порабощение вселенной...
zumm вне форума Ответить с цитированием
Старый 14.08.2013, 12:17   #6
admin-one
Пользователь
 
Регистрация: 14.07.2012
Сообщений: 31
По умолчанию

Цитата:
Сообщение от zumm Посмотреть сообщение
admin-one, этот код должен работать на любом приложении. Конечно же, при условии, что это приложение использует оконные компоненты.
я вот код :
Код HTML:
 MainProcessID := GetWindowThreadProcessId(Handle, nil); 
  EnumWindows(@CheckWindow, LParam(MainProcessID));
сунул в таймер и зашел в браузер гугл хром и там нажал на адресную строку (т.е перевел фокус курсора на адресную строку ) но туда ничего не записалось , а если перенести фокус на едит1 в моей проге то появляется ...
admin-one вне форума Ответить с цитированием
Старый 14.08.2013, 13:01   #7
zumm
БохЪ
Форумчанин
 
Аватар для zumm
 
Регистрация: 30.09.2009
Сообщений: 724
По умолчанию

Скорее всего, гугл хром использует свои компоненты. Рисованные контролы, которые не являются оконными. Попробуйте на другом приложении.
В планах порабощение вселенной...
zumm вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Скопировать текст содержащийся в ячейке таблицы и вставить этот текст в место документа помеченное закладкой. LiliPOOtin Microsoft Office Word 3 17.04.2013 19:51
Можно ли как-нибудь удалить, а затем вставить в нужное место в текстовике текст, не копируя весь документ. Jony217 PHP 3 17.01.2013 10:11
Курсор в нужное место Apostol13 Общие вопросы Delphi 3 13.06.2011 19:38
переход на заданный сайт или как вставить в заданное место заданный текст Biker89 Общие вопросы Delphi 23 29.05.2011 01:59
Поставить CreateThread в нужное место Sam Gold C/C++ Сетевое программирование 4 20.05.2010 23:46