Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2005.01.16;
Скачать: CL | DM;

Вниз

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 вся ветка

Текущий архив: 2005.01.16;
Скачать: CL | DM;

Наверх




Память: 0.49 MB
Время: 0.042 c
3-1102693499
Fedor
2004-12-10 18:44
2005.01.16
Вычисляемые поля


3-1103107737
Миша
2004-12-15 13:48
2005.01.16
многострочный вывод данных в отчет


6-1098890522
CRACKISH
2004-10-27 19:22
2005.01.16
TTcpServer и TTcpServer из вкладки Internet


1-1103828956
LedWorm
2004-12-23 22:09
2005.01.16
Пробег по элементам TreeView


14-1103899690
olookin
2004-12-24 17:48
2005.01.16
Налоги с зарплаты спортсмена