Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2003.05.08;
Скачать: CL | DM;

Вниз

Где у Лейбэла Handle???(или почему это не TWinControl)   Найти похожие ветки 

 
Igor__ ©   (2003-04-17 20:09) [0]

Есть программа.
Пишу другую программу которая должна прочитать текст з Лейбела первой.


 
Scorp   (2003-04-17 20:15) [1]

мда ....


 
default ©   (2003-04-17 20:18) [2]

потому что это не окно
а события типа OnClick попадая сначала(конечно "приходят" сообщения а ещё точней винда вызывает процедуру окна с парам-ами сообшения но это тут не важно) в окно-родитель данной
метки потом этим родителем передаются ей


 
Anatoly Podgoretsky ©   (2003-04-17 20:31) [3]

Это рисунок, применяй OCR


 
Axis_of_Evil ©   (2003-04-18 09:53) [4]

Тога заондо и вопрос:

TSpeedButton = class(TGraphicControl)

Но у нее есть wm_****.
Почему?
Т.е. просьба пояснить хрень о TControl -- TWinControl
\- TGraphicControl


 
Cobalt ©   (2003-04-18 10:22) [5]

А почитать справку?
TGraphicControl->Creating graphic controls


 
Digitman ©   (2003-04-18 10:37) [6]

Наследники TGraphicControl не имеют своего собственного окна. За перерисовку областей, распределенных под такие контролы, отвечает окно-"контейнер", получающее соотв.сообщения и обрабатывающее их должным образом в своей оконной процедуре.


 
Igor__ ©   (2003-04-18 12:37) [7]

1. Почему вопрос перенесли?
2. Мне нужно узнать текст с этого лейбэла!!! То что это не окно я знаю. Может послать какое-то сообщение контейнеру, чтоб тот переопределил его лейбэлу.


 
Anatoly Podgoretsky ©   (2003-04-18 12:42) [8]

WinAPI ничего не знает про Борландовские компоненты :-)
А ты что против этой конференции?


 
malkolinge ©   (2003-04-18 12:44) [9]

То что лейбл реагирует на сообщения - заслуга родителя .. Как тебе получить ее текст - фиг ее знает..На первый взгляд напращиваеться засунуть туда что то оконное..например обычный ТЕдит...который выключит и заставить виглядеть как лейбл. Все осатальные варианты вынудят Вас создавать специальную панель для вашей леблы, которая и будет отвечать за отпр/получ сообщения... ИМХО


 
Igor__ ©   (2003-04-18 13:26) [10]

Посколюку лабел реагирует на сообщения типа OnClick, может он и зареагирует на WM_GetText. Но как мне отправить его лейбелу через Handle, его носителя. В крайнем случае, может в памяти другого процесса чтото рыть. Но что?


 
Ihor Osov'yak ©   (2003-04-18 13:51) [11]

2 Igor__ © (18.04.03 13:26)

Да уж... Эта, OnClick и WM_GetText ну.. С разных приходов они..


Зы. Послушай умных людей, поставь вместо лейбла статик текст - это оконный обьект..

А если все же работать с лейбом очень уж неймется - то все же можно.. Но очень дорого обойдется.


 
Ihor Osov'yak ©   (2003-04-18 14:12) [12]

В дополнение. О приходах.

WM_GetText - сообщение виндовс.
OnClick - не сообщение. Это обработчик события, в терминах делфи. Мне термин "обработчик" в этом контексте кажется несколько неудачным. Более бы подходил-бы термин типа "зацепка".. Ибо за всякие OnXXXXX на закладке евентс для компонентов мы "зацепляем" свои процедуры-обработчики сообщений.. Но это отступление.

.. В общем случае тот факт, что какой-то компонент имеет соотв. обработчик, еще не значит, что он умеет работать с сообщениями виндовс. Хотя бы по причине того, что он не инкапсулирует какого-то оконного обьекта...


 
Anatoly Podgoretsky ©   (2003-04-18 14:21) [13]

Конечно он не обработчик сообщения, а только переменная процедурного типа, но в истории развития, многие крупные фирмы не избежали неточности в терминологии, у того же Борланда их куча.


 
Igor__ ©   (2003-04-18 16:53) [14]

Ihor Osov"yak:
Ты наверное слехка не понял. Я не имею доступ до кода приложения с которого нужно вытащить лайбэл. Это совсем не моя программа. Так что чё ты говорил о неймётся???

Я тут порыл в сторону ReadProcessMemory. Но адрес уж больно изменчив. Может есть методы его вычисления?

Да кстати при чтении памяти с помощю ReadProcessMemory иногда выскакивает ошыбка 299 (с хелпа - ERROR_PARTIAL_COPY). Но чё это означает?


 
Anatoly Podgoretsky ©   (2003-04-18 16:56) [15]

Ну так тебе поможет только OCR, это же только картинка на экране и никакого АПИ, поскольку Виндоус ничего не знает про Паскаль и даже самого текста может нигде не быть в памяти, получили от системы, нарисовали и забыли.
А насчет OCR это известный метод для подобных случаев


 
Igor__ ©   (2003-04-18 17:19) [16]

Извмняюсь за глупый вопрос - что такое OCR???


 
Anatoly Podgoretsky ©   (2003-04-18 17:30) [17]

Оптическое Распознование Образов
Ведь у тебя кроме картинки на экране ничего нет. И программа чужая.


 
Soft ©   (2003-04-18 17:37) [18]

>>Извмняюсь за глупый вопрос - что такое OCR???

Система распознавания текста. Например FineReader:) Проще будет взломать программу и покопатся внутри:)

Попробуй получить указатель на метод
function FindComponent(const AName: string): TComponent;
Внутри готового приложения. Но это уже не Win Api а отладка кода под SoftIce.

PS
Если разберешься- магом будешь:)


 
Digitman ©   (2003-04-18 17:50) [19]


> Igor__


твоя задача в принципе не так уж и нерешаема (но - достаточно сложно !), но решаема она только в том случае, если версии Делфи "чужого" и "своего" приложений совпадают с точностью до номера билда.

ключевой момент в решении - глобальный атом (автоматически создаваемый кодом в модуле Controls) как св-во окна некоей формы "чужого" приложения (на которой лежит искомый целевой компонент) имеет значение, равное адресу экземпляра формы в вирт.адресном пространстве процесса "чужого" приложения.


 
Digitman ©   (2003-04-18 18:02) [20]

зная адрес экз-ра формы, можно внедрить в "чужой" процесс "свой" тред (с параметром, равным зн-ю адреса экз-ра, либо трэд сам его может найти перед тем, как обращаться к нему), который будет обращаться к экз-ру формы обычным образом - точно так же, как если бы это делалось в "своем" приложении.

лишь бы версии совпадали)


 
Igor__ ©   (2003-04-18 18:32) [21]


> Digitman

Ну, версии не совпадают, так что это отпадает.

Может кто знает как розпредиляется память в Дельфы (т. е. как можно вычислить адрес этого лабела(естественно в чужом процессе)).

И заодно:
HMain:=FindWindow("SomeClss","some caption");
GetWindowThreadProcessId(HMain,HPrID);

hPr:=OpenProcess(PROCESS_VM_READ,False,hPrID);

ReadProcessMemory(Hpr,Pointer(addr),@p,2,ok);
ShowMessage(IntToStr(GetLastError));

где
addr - адрес чтения
p - array[0..Max_Path] of char;

В каком случае может возникнтуть ошыбка (я имею дело с ошыбкой 299). Как можно обойти это??? Может какие привилегии нужны??? Но всё же не во всех случаях даёт ошыбку!!!


 
Cobalt ©   (2003-04-18 19:08) [22]

ShowMessage(SysErrorMessage(GetLastError))


 
dimod   (2003-04-18 19:22) [23]

Используй ф-цию GetTextBuf:

var
Buffer: PChar;
Size: Byte;
edit: TLabel;
s : String;
....
Size := TWinControl(edit).GetTextLen;
Inc(Size);
GetMem(Buffer, Size);
TWinControl(edit).GetTextBuf(Buffer,Size);
s := StrPas(Buffer);
FreeMem(Buffer, Size);


 
dimod   (2003-04-18 19:26) [24]

Извиняюсь, не досмотрел...


 
Igor__ ©   (2003-04-18 19:41) [25]


> Cobalt

Можно и так написать. Признаюсь - это удобнее. Но не решает пробрему. Ошыбка: "Запрос ReadProcessMemory или WriteProcessMemory был выполнен только частично". Как это можно понять и как это исправить??? Вопрос остался без ответа.


 
Ihor Osov'yak ©   (2003-04-18 23:26) [26]

Перехват апишных функций поможет. Но процесс очень трудоемок. Собственно не так сам перехват, как с перехваченного потока того, чего нужно... Если мне память не изменяет - лейба в конечном итоге обращается к TextOutA...


 
Igor__ ©   (2003-04-19 04:09) [27]

Всем спасибо. Уже сам нашёл ответ.

В памяти ищу некоторые свойства лейба и таким образом читаю лабд.

Может не еыыективно но....



Страницы: 1 вся ветка

Текущий архив: 2003.05.08;
Скачать: CL | DM;

Наверх




Память: 0.53 MB
Время: 0.027 c
1-23057
-= Demon =-
2003-04-24 20:10
2003.05.08
Определение, запущена ли программа


6-23278
LORD
2003-03-11 22:48
2003.05.08
Когда закачиваются картинки ?


3-22921
IgorP
2003-04-19 11:23
2003.05.08
Кто работает с MSSQL через dbexpress отзовитесь


3-23019
KIR
2003-04-18 11:18
2003.05.08
Народ, можно ли изменить имя таблицы IB?


1-23085
Shuric
2003-04-24 22:09
2003.05.08
GetTickCount