Функция FindWindowEx не может найти Label

Модераторы: Duncon, Naeel Maqsudov, Игорь Акопян, Хыиуду

Viktor Zull
Сообщения: 117
Зарегистрирован: 10 ноя 2005, 02:00

Приветствую всех учатсников форума.
Поделитесь мыслями.

Неоднократно у меня возникала необходимость находить элементы управления в окнах, и всегда удавалось сделать это по следующей схеме:

W := FindWindow(nil,'имя окна');
if W <> 0 then
WE := FindWindowEx(W,0,nil,nil);

Проблема возникла при попытке найти метку в окне программы, созданной в Delphi.
Функция FindWindowEx метку не находит.

Для тестирования я сделал пустой проект в Delphi с одной фомой, на которой расположен 1 компонент Label1. При выполнении приведенного выше кода, функция FindWindowEx ничего не нашла.

В аналогичном пустом проекте на форме присутствует 1 компонент Button. Тогда функция FindWindowEx его находит.

Очевидно, что компоненты Label окнами не считаются. Как же тогда найти метку в окне?
MOTOCoder
Сообщения: 548
Зарегистрирован: 14 янв 2008, 20:27
Откуда: Россия, Псков

Похоже никак-окном label действительно не является(его даже EnumWindows не видит).
Ни что так не ограничивает фантазию программиста, как компилятор...
Viktor Zull
Сообщения: 117
Зарегистрирован: 10 ноя 2005, 02:00

Да я тоже после пробовал найти с помощью EnumWindows. Не получилось. Как же тогда найти. Есть идея?

Может четез FindControl или FindComponent.
MOTOCoder
Сообщения: 548
Зарегистрирован: 14 янв 2008, 20:27
Откуда: Россия, Псков

А какие операции планируется производить с найденным окном?
Ни что так не ограничивает фантазию программиста, как компилятор...
Viktor Zull
Сообщения: 117
Зарегистрирован: 10 ноя 2005, 02:00

Нужно установить в данном окне (метке) текст.
BBB
Сообщения: 1298
Зарегистрирован: 27 дек 2005, 13:37

Что-то не пойму. Если это твоя форма, то в ее дельфийном описаниии (классе - наследнике от TForm) есть поле, соответсвующее этой метке. Почему бы не обратиться к этому полю?

Если уж почему-то требуется именно такой алгоритм, можно заменить TLabel на TStaticText. StaticText - полноченное окно и имеет свой handle.
Viktor Zull
Сообщения: 117
Зарегистрирован: 10 ноя 2005, 02:00

BBB, я использую свою форму с меткой только для тестирования. Мне нужно в чужом окне, программы созданной в Delphi и уже скомпилированной в исполняемый файл (исходников нет) изменить текст в метке.

Соответственно я немогу изменить Label на StaticText. И не могу использовать Label1.Caption := 'нужный текст'.

Достоверно известно, что программа, в окне которой я пытаюсь сделать исправления создана в Delphi, и в ее окне есть компонент Label1.

Непонятно как найти этот компонент, обратиться к его свойствам. Теоритетически для этого есть функция FindControl, результат которой - элемент управления со всеми его свойствами, но в ее параметр нужно передать сначала Handle окна-этого элемента управления.
BBB
Сообщения: 1298
Зарегистрирован: 27 дек 2005, 13:37

Viktor Zull,
а как насчет идеи "хакнуть" EXE-шник? Т.е. попробовать найти существующий текст. И потом hex-вьюером/редактором изменить на нужный. Единственное ограничение в этом случае - новый текст, по-видимому, не может быть длиннее существующего.

Провел у себя эксперимент. В принципе, результат положительный. Только тонкость: кириллица текста Label-а у меня в EXE-шке присутствует в Unicode-кодировке (т.е. примерно так же, как текст записан в файле *.dfm дельфийного проекта)
Viktor Zull
Сообщения: 117
Зарегистрирован: 10 ноя 2005, 02:00

Текст в этой метке может изменяться в процессе работы программы. Может быть любым. Я знаю что изначально при запуске программы текст в метке: Label1. Если я отредактирую hex редактором exe - поставлю свой текст, то сначала это будет мой текст, а затем он будет изменен. Верно?
Viktor Zull
Сообщения: 117
Зарегистрирован: 10 ноя 2005, 02:00

А можно в Delphi заменить значение в процессе работы программы? Например я знаю такую программу ArtMoney. С ее помощью можно находить числовые значения в запущенной программе и зменять их. Текст Artmoney икать не умеет.
Ответить