Форум: "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