Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "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.036 c
14-1104325073
BiN
2004-12-29 15:57
2005.01.16
Дизассемблер на Паскале


1-1104144168
lexis
2004-12-27 13:42
2005.01.16
Нужен хитрый chart


1-1104825284
antoxa
2005-01-04 10:54
2005.01.16
Можно ли на Delphi писать для Интернет под UNIX


3-1102874458
korvin
2004-12-12 21:00
2005.01.16
Парадокс с выходными данными в серверной процедуре


1-1104294460
Новичек
2004-12-29 07:27
2005.01.16
Серийный номер жесткого диска.





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