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

Вниз

GetWindowText и WinSight   Найти похожие ветки 

 
PHN   (2002-10-18 01:22) [0]

Почему WinSight может считывать текст любого окна, а GetWindowText для многих дочерних окон возвращает nil.
Есть ли какой-нибудь другой способ прочитать текст окна?


 
Ihor Osov'yak   (2002-10-18 21:59) [1]

GetWindowText работает в пределах своего процесса.
Для считывания с чожого процесса - юзать нужно WM_GETTEXT, к примеру:


function Get_Text(aWnd:THandle):string;
var wS:string;
begin
SetLength(ws,SendMessage(aWnd,WM_GETTEXTLENGTH,0,0)+1);
SendMessage(aWnd,WM_GETTEXT,Length(ws),integer(pchar(ws)));
if length(ws)>0
then Result := Copy(ws,1,length(ws)-1)
else Result := "";
SetLength(ws,0);
end;

Зы. А WinSight не со всех окон считывает .... Поспешные выводы делаете, уважаемый.
Также и приведенный выше пример не со всех окошек
текст возьмет. Нужно чтобы окошко на WM_GETTEXT текст отдавало. А это уже от писателя зависит...


Зы2. Решение в общем случае не существует. В крайнем случае - с использованием стандартных решений.
Один из способов решения рассматривался здесь
http://delphi.mastak.ru/cgi-bin/forum.pl?look=1&id=1033977895&n=5




 
PHN   (2002-10-19 02:19) [2]

Ну не любые, но многие :))


 
PHN   (2002-10-19 02:28) [3]

Большое спасибо Ihor Osov"yak , предложенный вариант отлично справляется!


 
Василий2   (2002-10-19 07:37) [4]

Ihor Osov"yak

"GetWindowText работает в пределах своего процесса.
Для считывания с чожого процесса - юзать нужно WM_GETTEXT, к примеру..."

Ничего подобного. GetWindowText работает с чем угодно, только надо знать ПРАВИЛЬНЫЙ ХЕНДЛ!!!!!!





 
Ihor Osov'yak   (2002-10-19 22:34) [5]

to Василий2 © (19.10.02 07:37)



> Ничего подобного. GetWindowText работает с чем угодно, только
> надо знать ПРАВИЛЬНЫЙ ХЕНДЛ!!!!!!


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

... Зы, жду ответа, как соловушка лета ...



 
Юрий Зотов   (2002-10-20 00:35) [6]

По-видимому, оба правы, и оба нет. Хелп по GetWindowText гласит:

"This function cannot retrieve the text of an edit control in another application".

Подробнее сказано в MSDN:

"If the target window is owned by another process and has a caption, GetWindowText retrieves the window caption text. If the window does not have a caption, the return value is a null string. This behavior is by design. It allows applications to call GetWindowText without hanging if the process that owns the target window is hung. However, if the target window is hung and it belongs to the calling application, GetWindowText will hang the calling application".


 
Ihor Osov'yak   (2002-10-20 10:47) [7]

to Юрий Зотов © (20.10.02 00:35)

> По-видимому, оба правы, и оба нет


Ну, Юрий, Вы и философ. Позволю и я себе немножко философии. Я встречал (не единыжды) ситуацию, о которой в мsdn говорится, что должно работать, а в самом деле - не работает. Поэтому я никогда не использую средства в тех ситуациях, о которых прямо сказано, что в этой ситуации они работать не будут. Это по поводу
> "This function cannot retrieve the text of an edit control
> in another application".


Зы. А на практике см. PHN © (19.10.02 02:28)
Зы2 Я всегда юзаю SendMessage(aWnd,WM_GETTEXT.... (по причине, оговоренной выше)




 
Ihor Osov'yak   (2002-10-20 10:55) [8]

Сорри, в дополнение...

Может Вы, Юрий, расскроете страшную тайну правильных и неправильных хендлов? :-)

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


 
Юрий Зотов   (2002-10-20 12:47) [9]

Ну при чем тут философия?

Один говорит:
"GetWindowText работает в пределах своего процесса.
Для считывания с чужого процесса - юзать нужно WM_GETTEXT".

Насчет GetWindowText: если нужно получить текст контрола - он прав, если Caption - нет. Насчет WM_GETTEXT - верно, это универсальный способ.

Другой говорит:
"GetWindowText работает с чем угодно,
только надо знать ПРАВИЛЬНЫЙ ХЕНДЛ."

Насчет GetWindowText: все наоборот ,если нужно получить текст контрола - он неправ, если Caption - прав. Насчет правильного хэндла: насколько я понял, имелось в виду правильное получение хэндла - то есть, именно того окна, которое интересует. В этом он, очевидно, прав.

Вот и выходит - оба правы и оба нет, смотря какой текст нужно получить. В вопросе это не уточняется.


> Я встречал (не единыжды) ситуацию, о которой в мsdn говорится,
> что должно работать, а в самом деле - не работает.

Я тоже. Правда, после более внимательного чтения MSDN и исправления ошибок в СВОЕЙ программе работать все-таки начинало. Точно так, как и было в MSDN написано.

Насчет процессозависимых хэндлов. Есть такое. Относится, например, к объектам, которые могут выступать объектами синхронизации. При запросе (скажем, СreateFile) система возвращает процессозависимый хэндл и увеличивает счетчик ссылок. При освобождении счетчик декрементируется и если стал нулевым - объект уничтожается/выгружается. К окнам это не относится - у них другой механизм создания/уничтожения.

Cм. также справку по DuplicateHandle и секцию Remarks в ней.


 
Ihor Osov'yak   (2002-10-20 13:12) [10]

2 Юрий Зотов © (20.10.02 12:47)

Спасибо за разъяснения.

По поводу -
> Я тоже. Правда, после более внимательного чтения MSDN и
> исправления ошибок в СВОЕЙ программе работать все-таки начинало.
> Точно так, как и было в MSDN написано.

Может это несколько самонадеяно - но я имеюю ввиду случаи, когда все же свои ошибки исключены. И довольно часто потом в каком-то укромом местечке того же msdn все-же встречаешь упоминание об этом баге. Или находишь подтверждение в независимых источниках.
Но сколько времени угрохалось-то на ловлю той черной кошки в темной комнате, которая в то время была совсем то в ином месте. Или вообще не существовала...

Я, как минимум, три таких примера привести могу (я имею ввиду не совсем корректную инфу в msdn)...

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



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

Форум: "WinAPI";
Текущий архив: 2002.12.02;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.48 MB
Время: 0.007 c
6-4541
Дмитрий К.К.
2002-10-06 19:11
2002.12.02
MSHTML_TLB.pas


3-4256
Tumcoat
2002-11-14 04:49
2002.12.02
Поблемы с запросом в элементе Query


1-4396
borg
2002-11-22 07:28
2002.12.02
Алгоритм проверки


1-4418
Tyke
2002-11-21 15:23
2002.12.02
реализация шаблона Singleton


14-4628
Николай Быков
2002-11-12 10:21
2002.12.02
Почему вы так грубы?





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский