Функция FindWindowEx не может найти Label
Модераторы: Duncon, Naeel Maqsudov, Игорь Акопян, Хыиуду
-
- Сообщения: 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 окнами не считаются. Как же тогда найти метку в окне?
Поделитесь мыслями.
Неоднократно у меня возникала необходимость находить элементы управления в окнах, и всегда удавалось сделать это по следующей схеме:
W := FindWindow(nil,'имя окна');
if W <> 0 then
WE := FindWindowEx(W,0,nil,nil);
Проблема возникла при попытке найти метку в окне программы, созданной в Delphi.
Функция FindWindowEx метку не находит.
Для тестирования я сделал пустой проект в Delphi с одной фомой, на которой расположен 1 компонент Label1. При выполнении приведенного выше кода, функция FindWindowEx ничего не нашла.
В аналогичном пустом проекте на форме присутствует 1 компонент Button. Тогда функция FindWindowEx его находит.
Очевидно, что компоненты Label окнами не считаются. Как же тогда найти метку в окне?
Похоже никак-окном label действительно не является(его даже EnumWindows не видит).
Ни что так не ограничивает фантазию программиста, как компилятор...
-
- Сообщения: 117
- Зарегистрирован: 10 ноя 2005, 02:00
Да я тоже после пробовал найти с помощью EnumWindows. Не получилось. Как же тогда найти. Есть идея?
Может четез FindControl или FindComponent.
Может четез FindControl или FindComponent.
А какие операции планируется производить с найденным окном?
Ни что так не ограничивает фантазию программиста, как компилятор...
-
- Сообщения: 117
- Зарегистрирован: 10 ноя 2005, 02:00
Нужно установить в данном окне (метке) текст.
Что-то не пойму. Если это твоя форма, то в ее дельфийном описаниии (классе - наследнике от TForm) есть поле, соответсвующее этой метке. Почему бы не обратиться к этому полю?
Если уж почему-то требуется именно такой алгоритм, можно заменить TLabel на TStaticText. StaticText - полноченное окно и имеет свой handle.
Если уж почему-то требуется именно такой алгоритм, можно заменить TLabel на TStaticText. StaticText - полноченное окно и имеет свой handle.
-
- Сообщения: 117
- Зарегистрирован: 10 ноя 2005, 02:00
BBB, я использую свою форму с меткой только для тестирования. Мне нужно в чужом окне, программы созданной в Delphi и уже скомпилированной в исполняемый файл (исходников нет) изменить текст в метке.
Соответственно я немогу изменить Label на StaticText. И не могу использовать Label1.Caption := 'нужный текст'.
Достоверно известно, что программа, в окне которой я пытаюсь сделать исправления создана в Delphi, и в ее окне есть компонент Label1.
Непонятно как найти этот компонент, обратиться к его свойствам. Теоритетически для этого есть функция FindControl, результат которой - элемент управления со всеми его свойствами, но в ее параметр нужно передать сначала Handle окна-этого элемента управления.
Соответственно я немогу изменить Label на StaticText. И не могу использовать Label1.Caption := 'нужный текст'.
Достоверно известно, что программа, в окне которой я пытаюсь сделать исправления создана в Delphi, и в ее окне есть компонент Label1.
Непонятно как найти этот компонент, обратиться к его свойствам. Теоритетически для этого есть функция FindControl, результат которой - элемент управления со всеми его свойствами, но в ее параметр нужно передать сначала Handle окна-этого элемента управления.
Viktor Zull,
а как насчет идеи "хакнуть" EXE-шник? Т.е. попробовать найти существующий текст. И потом hex-вьюером/редактором изменить на нужный. Единственное ограничение в этом случае - новый текст, по-видимому, не может быть длиннее существующего.
Провел у себя эксперимент. В принципе, результат положительный. Только тонкость: кириллица текста Label-а у меня в EXE-шке присутствует в Unicode-кодировке (т.е. примерно так же, как текст записан в файле *.dfm дельфийного проекта)
а как насчет идеи "хакнуть" EXE-шник? Т.е. попробовать найти существующий текст. И потом hex-вьюером/редактором изменить на нужный. Единственное ограничение в этом случае - новый текст, по-видимому, не может быть длиннее существующего.
Провел у себя эксперимент. В принципе, результат положительный. Только тонкость: кириллица текста Label-а у меня в EXE-шке присутствует в Unicode-кодировке (т.е. примерно так же, как текст записан в файле *.dfm дельфийного проекта)
-
- Сообщения: 117
- Зарегистрирован: 10 ноя 2005, 02:00
Текст в этой метке может изменяться в процессе работы программы. Может быть любым. Я знаю что изначально при запуске программы текст в метке: Label1. Если я отредактирую hex редактором exe - поставлю свой текст, то сначала это будет мой текст, а затем он будет изменен. Верно?
-
- Сообщения: 117
- Зарегистрирован: 10 ноя 2005, 02:00
А можно в Delphi заменить значение в процессе работы программы? Например я знаю такую программу ArtMoney. С ее помощью можно находить числовые значения в запущенной программе и зменять их. Текст Artmoney икать не умеет.