Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Потрепаться";
Текущий архив: 2003.05.08;
Скачать: [xml.tar.bz2];

Вниз

Где у Лейбэла 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;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.51 MB
Время: 0.009 c
14-23398
Supreme 2
2003-04-21 19:31
2003.05.08
Как убрать


1-23071
1111а
2003-04-24 23:09
2003.05.08
Возможно ли сделать прозрачным (Transparent) фон TEdit?


3-23009
Trim
2003-04-17 16:43
2003.05.08
Database Workshop


11-23052
Alexei Dragoner
2002-07-31 13:33
2003.05.08
Еще пару глюков...и вопросов


1-23113
real_fatboy
2003-04-27 13:40
2003.05.08
Уходим в трэй





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский