Вставьте текст из редактирования в любое окно, где находится указатель мыши.

Как я могу вставить текст из элемента управления Edit в любое окно, где находится указатель мыши, без использования буфера обмена и/или дескриптора окна.

Я использую Делфи 7.


person Yurios    schedule 12.10.2011    source источник
comment
Решение Дэвида отличное (+1), если вы ДЕЙСТВИТЕЛЬНО хотите отправить туда, где находится указатель мыши. Я подозреваю, что полезнее отправлять в окно с фокусом ввода, которое может быть таким же, или, если вы один из тех людей, которым нравится отталкивать курсор мыши в сторону, когда они печатают или читают, это может быть где-то совсем по другому.   -  person Chris Thornton    schedule 13.10.2011
comment
+1 за то, что изо всех сил старались избежать (ab) использования буфера обмена.   -  person Chris Thornton    schedule 13.10.2011
comment
Спасибо, но у меня все еще есть проблемы с кодом wource. Я знаю, что это просто, но мой уровень программирования совсем начальный.   -  person Yurios    schedule 13.10.2011


Ответы (1)


  1. Вызовите GetCursorPos, чтобы узнать, где находится курсор .
  2. Вызовите WindowFromPoint, чтобы найти окно под курсором .
  3. Отправьте сообщение EM_REPLACESEL, чтобы заменить выделение это окно. Если ничего не выделено, текст будет вставлен в каретку.

Примечание. Будьте готовы к тому, что это чаще приведет к неудаче, чем к успеху. Многие приложения не используют элементы оконного редактирования. Чтобы найти более надежное решение, обратитесь к автоматизации пользовательского интерфейса.


Вы просили какой-то код. Вот как это будет выглядеть:

var
  Pos: TPoint;
  Target: HWND;
...
if not GetCursorPos(Pos) then
  RaiseLastOSError;
Target := WindowFromPoint(Pos);
if Target<>0 then
  SendMessage(Target, EM_REPLACESEL, ord(True), LPARAM(PChar(Edit1.Text)));

Если окно под курсором не является окном редактирования, это, вероятно, будет безобидным.

person David Heffernan    schedule 12.10.2011
comment
Я понял структуру. - person Yurios; 13.10.2011
comment
Еще один вопрос: как я могу получить текст из tEdit, а не только символ орка, такой как X SendMessage (h, WM_CHAR, Ord ('x'), 0); ? Спасибо. - person Yurios; 13.10.2011
comment
code ч:DWORD; ПолучитьКурсорПос(пт); ч: = WindowFromPoint (pt); надеюсь я на правильном пути? - person Yurios; 13.10.2011
comment
Я этого не понимаю. Вы не можете спросить об этом в комментарии. Либо задайте новый вопрос, либо отредактируйте этот. Но сделайте это новым вопросом, если он не тесно связан с этим вопросом. - person David Heffernan; 13.10.2011
comment
Это так удивительно! Оно работает!!! Я очень счастлив. Хотел бы я вам прислать, но программку на русском языке. Скоро переведу. Я никогда не забуду твой вклад в мой сон. Большое спасибо! - person Yurios; 13.10.2011
comment
Я рад, что ты счастлив. Вы можете принять ответ, сделав большую галочку зелёной! :-) - person David Heffernan; 13.10.2011
comment
Теперь у меня новая проблема: текст из tEdit может вставляться везде - как Блокнот, Icq. НО не Firefox, Google Chrome. Что это может быть? Спасибо. - person Yurios; 13.10.2011
comment
Я уже ответил на это в своей заметке. Эти приложения не используют оконные элементы управления. Вам нужно использовать автоматизацию пользовательского интерфейса или какой-либо другой API специальных возможностей. - person David Heffernan; 13.10.2011
comment
Я узнал предыдущую ссылку об автоматизации пользовательского интерфейса. Есть много информации, с которой мой языковой опыт не справляется. Также я не видел ни слова о Delphi. Сложно добавить автоматизацию пользовательского интерфейса в Delphi и в мой проект? Я действительно такой, может от этого зависит будущее :), надеюсь. Я могу вернуть тебе доброту. Я очень обязан вам. - person Yurios; 13.10.2011
comment
То, что вы пытаетесь сделать, действительно сложно. Я не могу помочь в комментариях, и я недостаточно знаю об автоматизации пользовательского интерфейса или альтернативах в целом в любом случае. - person David Heffernan; 13.10.2011