Текущий архив: 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.51 MB
Время: 0.009 c