Вставка данных

Вопросы программирования и использования среды Lazarus.

Модератор: Модераторы

Ответить
novo
новенький
Сообщения: 43
Зарегистрирован: 31.07.2011 21:35:10

Вставка данных

Сообщение novo »

Здравствуйте)

Задача такая, необходимо сделать "вставлялку" данных т.е. после установки курсора в Edit какой либо программы при нажатии определенного сочетания клавиш программа
выдает меню в котором можно выбрать данные из списка заранее составленного и вставляет выбранные данные в Edit.


Со вставкой данных все более мене понятно, можно использовать что то вроде:

Код: Выделить всё

var
s: PChar;
h: THandle;
begin
s := 'Krakozjabra';
h := FindWindow(nil,'Form1');
h := FindWindowEx( h, 0, 'TEdit',nil);
SendMessage(h, WM_SETTEXT, 0, Integer(s));


А вот как получить handle Edit-а в котором установлен курсор

Для окна над котором находится курсор нашел

Код: Выделить всё

WindowFromPoint(CrPos);


А вот для фокуса не могу найти.

Помогите кто чем может)

Добавлено спустя 1 час 30 минут 25 секунд:
Вроде как пошло дело)

Код: Выделить всё

function MyGetFocus: HWND;
var
  dwTargetOwner: DWORD; //указатель на подключаемый процесс
  dwThreadID: DWORD; //указатель на текущий процесс
begin
 try
  dwTargetOwner := GetWindowThreadProcessId(GetForegroundWindow, nil);
  dwThreadID := GetCurrentThreadId(); //указатель на текущий процесс
  if (dwTargetOwner <> dwThreadID) then   AttachThreadInput(dwThreadID, dwTargetOwner, TRUE)
 else  AttachThreadInput(dwThreadID, dwTargetOwner, FALSE);
 result:=GetFocus;
 except
   Result:=0;
   end;
  end; 


Добавлено спустя 7 часов 55 минут 14 секунд:
Я так понял, что большинство Edit-ов плевать хотели на WM_SETTEXT

Пробовал так:

Код: Выделить всё

SendMessage( MyGetFocus  , WM_SETTEXT, 0, Integer(s));   

Работает 50/50

Подскажите аналог
Аватара пользователя
Лекс Айрин
долгожитель
Сообщения: 5723
Зарегистрирован: 19.02.2013 16:54:51
Откуда: Волгоград
Контактная информация:

Сообщение Лекс Айрин »

если я правильно помню, то PostMessage/ PostThreadMessage
novo
новенький
Сообщения: 43
Зарегистрирован: 31.07.2011 21:35:10

Сообщение novo »

С PostMessage и PostThreadMessage вообще никакой реакции)
Аватара пользователя
Лекс Айрин
долгожитель
Сообщения: 5723
Зарегистрирован: 19.02.2013 16:54:51
Откуда: Волгоград
Контактная информация:

Сообщение Лекс Айрин »

Значит, помню неправильно.
novo
новенький
Сообщения: 43
Зарегистрирован: 31.07.2011 21:35:10

Сообщение novo »

Плюнул на WM_SETTEXT
Пока использую такую конструкцию

Код: Выделить всё

s:='Hello world';
 for i:=1 to length(s) do sendmessage(ObjectHandle,WM_CHAR,ord(s[i]),0)


Я так понимаю о русских символах мечтать не приходится?

Добавлено спустя 18 минут 16 секунд:
На счет русского погорячился

Код: Выделить всё

function SetWinText(aText:string):boolean;
var
i:integer;
begin
 Result:=true;
 try
 if ObjectHandle<>0 then
for i:=1 to length(aText) do sendmessage(ObjectHandle,WM_CHAR,ord(aText[i]),0);
 except
   Result:=false;
 end;
end;


Код: Выделить всё

var
s:string;
begin
s:='Просто текст';
 SetWinText(Utf8ToAnsi(s));
Ответить