Форум: "WinAPI";
Текущий архив: 2005.01.16;
Скачать: [xml.tar.bz2];
ВнизEnumWindows ненахдит окно Найти похожие ветки
← →
snake1977 (2004-11-25 12:59) [0]Здравствуйте! подскажите в чем беда, сделал такие вот процедуры
Function FindCaption(Caption:String; wait:Boolean=False; OneToOne:Boolean=False):HWND;
Begin
Find:=0;
Capt:=Caption;
if not OneToOne Then EnumWindows(@EnumProc, 0)
Else EnumWindows(@EnumProc2, 0);
while (Wait) and (Find=0) do
Begin
Application.ProcessMessages;
if not OneToOne Then EnumWindows(@EnumProc, 0)
Else EnumWindows(@EnumProc2, 0);
End;
Result:=Find;
End;
unction EnumProc(Wnd: hWnd; SL: LongInt): BOOL; stdcall;
var
szFull: array[0..255] of Char;
begin
Result := Wnd <> 0;
if Result then
begin
GetWindowText(Wnd, szFull, SizeOf(szFull));
if Pos(Capt,szFull)>0 Then
Begin
Find:=Wnd;
exit;
End;
end;
end;
unction EnumProc2(Wnd: hWnd; SL: LongInt): BOOL; stdcall;
... //тоже что и в EnumProc за исключением след. строки
if Pos Сapt=szFull Then
...
end;
установил таймер и по событию вывзываю процедуру
Procedure TForm1.OnTimer;
Var
szClass: array[0..255] of Char;
wnd,h2,dh:HWND;
Begin
Timer1.Enabled:=False;
wnd:=FindCaption("Zapros");
if Wnd<>0 Then
Begin
h2 := FindChild(Wnd,"Добавить");
SendMessage(h2, BM_CLICK, 0, 0);
h2 := FindChild(Wnd,"Составить");
SendMessage(h2, BM_CLICK, 0, 0);
dh:=FindCaption("Confirm",True);
h2 := FindChild(dh,"&Yes");
SendMessage(h2, BM_CLICK, 0, 0);
.....
и вот dh:=FindCaption("Confirm",True); приводит к зацикливанию :(
хотя окошко заголовком Confirm появляется (причем судя по виду, обычный MessageBox),
трассировал, но в процедуру EnumWindows дебагер не входит :(
Почему не находит окно??
проверял отдельной програмкой, просто выдающей список окошек, такое окошко в списке есть.
← →
Digitman © (2004-11-25 13:28) [1]
> в процедуру EnumWindows дебагер не входит
вот уж не вешай лапшу.
еще как заходит !
← →
snake1977 (2004-11-25 13:37) [2]незнаю незнаю но в EnumProc, который указан в качестве параметра
дебагер не вошел.
может у меня какойто другой дебагер , но это не суть важно
вопрос не в дебагере
вопрос в том почему не находит окошко с заголовком Confirm ?
← →
Digitman © (2004-11-25 13:52) [3]
> в EnumProc, который указан в качестве параметра
> дебагер не вошел
цитирую твой код :
if not OneToOne Then EnumWindows(@EnumProc, 0)
и не войдет, если OneToOne = True
если же OneToOne = False, то EnumProc просто ОБЯЗАНА получить управление хотя бы один раз ... хотя бы потому что существует хотя бы одно top-level-окно.
> судя по виду, обычный MessageBox
по виду ты можешь судить о чем угодно.
но коль скоро ты вызываешь именно FindWindow(), то ты тем самым требуешь к перечислению именно верхнеуровневые окна тек.дисктопа, и посему досужие домыслы насчет того, что там и как выглядит, попросту бессмысленны - в этом случае ты должен быть уверен, что искомое окно является именно верхнеуровневым окном, а не дочерним по отношению к какому-то иному окну.
← →
snake1977 (2004-11-25 14:20) [4]>>Digitman
>>но коль скоро ты вызываешь именно FindWindow(), то ты тем >>>самым требуешь ...
эт гдеж я вызываю то FindWindow????
я вызываю EnumWindows
и просмтриваю все загловки всех окошек
а процедура EnumProc отличается от EnumProc2 исключительно проверкой получчаемой строки , в первом случае поиск по подстроке вов вотором точное совпадение
← →
Digitman © (2004-11-25 14:35) [5]
> гдеж я вызываю то FindWindow????
> я вызываю EnumWindows
оговорился.
но суть обеих ф-ций одна и та же : обе шарят по списку верхнеуровневых окон
цитирую справки к обеим ф-циям :
The FindWindow function retrieves the handle to the top-level window ...
The EnumWindows function enumerates all top-level windows ...
и не надо уже придираться к несущественным ляпам !
еще раз повторяю, если ты не понял - в соответствии с приведенным ТОБОЙ кодом вызов EnumWindows(неважно какие параметры) ОБЯЗАН привести хотя бы к однократному вызову указанной в кач-ве параметра колбэк-ф-ции, потому что ты вызываешь ф-цию в контексте некоего текущего активного десктопа, который является владельцем хотя бы одного верхнеуровнего окна, например, того же гл.окна explorer-приложения
← →
snake1977 (2004-11-25 14:41) [6]Все оказалось более загадочней (хотя скорее всегоя просто этого не знаю), после вызова строк
h2 := FindChild(Wnd,"Составить");
SendMessage(h2, BM_CLICK, 0, 0);
моя процедура просто дальше не идет :(
т.е. я послал сообщение нажать на кнопочку "Составить"
она нажала, та программа выдала сообщение (окошко "Confirm"), и все моя процедура ждет пока ктонить не нажмет на кнопочку в том злополучном окошке, и только после этогопродолжает работать
:(
← →
Digitman © (2004-11-25 15:41) [7]и к чему была вся эта клоунада с телом FindСaption(), в кототром нет н6и намека ни на какие FindChild() ?
← →
Piter © (2004-11-26 18:31) [8]snake1977 (25.11.04 13:37) [2]
вопрос не в дебагере
совершенно верно. Вопрос в умении им пользоваться
Страницы: 1 вся ветка
Форум: "WinAPI";
Текущий архив: 2005.01.16;
Скачать: [xml.tar.bz2];
Память: 0.47 MB
Время: 0.037 c