Пример: как, имея HANDLE окна, добавить запись в
EditBox, находящемуся в этом окне?
Ответ
function ChangeWndFirstEditText(Wnd: HWND; const Text: string):
boolean;
var
EditWnd: HWND;
begin
Result := False;
EditWnd := FindWindowEx(Wnd, 0,
'EDIT', nil);
if EditWnd = 0 then
exit; // edit not found
Result := SendMessage(EditWnd, WM_SETTEXT, 0, Integer(PChar(Text))) <> 0;
end;
// Из конференции Expert_FAQ
What a great question!
Код, который вы предоставили, является на примере Delphi и демонстрирует использование функции FindWindowEx для поиска редактируемого контрола (контрола типа 'EDIT') в окне, указанном его handle (Wnd). После обнаружения использует функцию SendMessage для установки текста этого редактируемого контрола.
Вот разбивка кода:
Процедура ChangeWndFirstEditText принимает два параметра: Wnd, который является handle окна, содержащего редактируемый контроль, и Text, который является новым текстом для установки в редактируемый контроль.
Процедура инициализирует локальную переменную EditWnd для хранения handle найденного редактируемого контрола.
Она вызывает функцию FindWindowEx с следующими аргументами:
Wnd: handle окна, переданный в качестве аргумента.
0: пустой handle, указывающий на то, что мы начинаем с верхнего уровня окна.
'EDIT': имя класса редактируемого контрола, который мы ищем.
nil: null-указатель, указывающий на то, что у нас нет конкретного экземпляра редактируемого контрола для поиска.
Если функция FindWindowEx находит редактируемый контроль с указанным именем класса, она возвращает его handle в EditWnd. В противном случае она устанавливает EditWnd в 0 и выходит из процедуры.
Если был найден редактируемый контроль, процедура использует функцию SendMessage для отправки сообщения WM_SETTEXT редактируемому контролу, передавая новый текст (Text) как параметр. Проверка < 0 обеспечивает то, что сообщение было успешно отправлено.
Вот альтернативное решение с использованием встроенной функции Delphi Control:
procedure ChangeWndFirstEditText(Wnd: HWND; const Text: string);
var
EditCtrl: TEdit;
begin
EditCtrl := Control(Wnd, nil, TEdit);
if Assigned(EditCtrl) then
EditCtrl.Text := Text;
end;
В этом варианте мы используем функцию Control для поиска редактируемого контрола (TEdit) в окне с handle Wnd. Если найден, мы можем напрямую присвоить новый текст его свойству Text.
Добраться до любого управления (CONTROL) через Handle формы путем поиска нужного окна с помощью функции FindWindowEx и последующего отправки сообщения WM_SETTEXT для изменения текста в этом окне.
Комментарии и вопросы
Получайте свежие новости и обновления по Object Pascal, Delphi и Lazarus прямо в свой смартфон. Подпишитесь на наш Telegram-канал delphi_kansoftware и будьте в курсе последних тенденций в разработке под Linux, Windows, Android и iOS
Материалы статей собраны из открытых источников, владелец сайта не претендует на авторство. Там где авторство установить не удалось, материал подаётся без имени автора. В случае если Вы считаете, что Ваши права нарушены, пожалуйста, свяжитесь с владельцем сайта.