Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

enumchildwindows вопрос по последнему параметру


Den ©   (2013-08-01 09:41:00) 

enumchildwindows(hwnd, callBackFunction, ?????) что в последнем параметре? кто-то может по русски обьяснить?


Den   (2013-08-01 20:47:00) [1]

ну чтоб пошагово смотреть все регистры и стек как в дебаггере какомнить типа олли - нашел, походу ctrl-atl-K и буду разбирать че там к чему.


Styx   (2013-08-01 20:43:00) [2]


> где было видно что 2 параметра надо передавать?

Здесь: http://msdn.microsoft.com/en-us/library/windows/desktop/ms633493(v=vs.85).aspx


Den   (2013-08-01 20:37:00) [3]

удивительно. Спасибо всем поучавствовавшим. Не понимаю почему, но проблема решилась. Кто-то может обьяснить где было видно что 2 параметра надо передавать? Кудой они передавались? (я понимаю что через стек, вернее как на это посмотреть из Delphi2010 можно, ну чтоб пошагово смотреть все регистры и стек как в дебаггере какомнить типа олли) ато непонятнож ниче, где эти параметры прописаны? куда их записали? Короче в печали я, непонятно ниче.


Den   (2013-08-01 20:18:00) [4]

может действительно, оно думает что у него 2 параметра и стирает из-за этого лишние данные из стека, счас попробую че выйдет.


Den   (2013-08-01 20:12:00) [5]

Фиг знает, когда-то так сделал оно работало себе решил вот в xml вынести и н еработает оно теперь.


Styx   (2013-08-01 20:07:00) [6]

А откуда Вы взяли такое объявление для callback-функций? Должно быть что-то вроде
function MyFunc(i : HWND; Param: LPARAM) : WordBool; stdcall;


Den   (2013-08-01 19:51:00) [7]

Сори пришлось отвлечься. Такс в общем вот такая тема есть -

это кусок кода откуда они вызываются
if workNode.ChildNodes[i2].Nodename='FindWindow' then begin
     logme('FindWindow',memoForLogme);
     ProstoNode:=workNode.ChildNodes[i2];
     findByWindowName:=atr(ProstoNode,'findByWindowName');
     findByClassName:=atr(ProstoNode,'findByClassName');
     if findByWindowName='' then firstwnd:=findwindow(pchar(findByClassName), nil);
     if findByClassName='' then firstwnd:=findwindow(nil, PCHAR(findByWindowName));
     if firstwnd<>0 then begin
       logme('FindWindow firstwnd<>0',memoForLogme);
       for I5 := 0 to ProstoNode.ChildNodes.length -1 do begin
       
        if ProstoNode.ChildNodes[i5].nodeName='click' then begin
         logme('FindWindow firstwnd<>0 click',memoForLogme);
         windowNameNeedToClickOnGlobal:=atr(ProstoNode.ChildNodes[i5],'nameOfButtonToClic k');
         enumchildwindows(firstwnd, @ClickVizivaetsyaIsEnumChildWindows,0);
        end;
        if ProstoNode.ChildNodes[i5].nodeName='fill' then begin
         logme('FindWindow firstwnd<>0 fill',memoForLogme);
         windowNameNeedToClickOnGlobal:=atr(ProstoNode.ChildNodes[i5],'classNameOfElement ToFill');
         textToSetInEnumerateChilWindowsGlobal:=atr(ProstoNode.ChildNodes[i5],'textToSet' );
         howManyItemToPass:=atr(ProstoNode.ChildNodes[i5],'howManyItemToPass');
         HowManyItemsToPassGlobal:=strToInt(howManyItemToPass);
         CountOfRepiatedItemsGlobal:=0;
         enumchildwindows(firstwnd, @FillVizivaetsyaIsEnumChildWindows,0);
        end;
       end;
     end;
   end;


эта функция вызывается когда имя ноды =fill эта переменная CountOfRepiatedItemsGlobal указывает
сколько элементов пропустить, к примеру если на форме есть
несколько Edit то заполнит она тот на который укажет CountOfRepiatedItemsGlobal
function FillVizivaetsyaIsEnumChildWindows(w:hwnd):bool;stdcall;    //dlya open
var
arrayWithChildWindowClassName:array[0..255]of char;
i:integer;
lastErr:integer;
s,s1:string;
begin
 result:=true;
 GetClassName(w,  arrayWithChildWindowClassName, SizeOf(arrayWithChildWindowClassName));
 s:=arrayWithChildWindowClassName;
 if s=windowNameNeedToClickOnGlobal then begin
   if HowManyItemsToPassGlobal=0 then SendMessage(w, wm_settext, 0, wparam(Pchar(textToSetInEnumerateChilWindowsGlobal))) else
   if CountOfRepiatedItemsGlobal=HowManyItemsToPassGlobal then SendMessage(w, wm_settext, 0, wparam(Pchar(textToSetInEnumerateChilWindowsGlobal)));
   inc(CountOfRepiatedItemsGlobal);
 end;
end;

а эта когда имя ноды =fill

function ClickVizivaetsyaIsEnumChildWindows(w:hwnd):bool;stdcall;    //dlya open
var
arrayWithChildWindowName:array[0..255]of char;
s,s1:string;
begin
 result:=true;
 sendmessage(w, WM_GETTEXT, 256,INteger(@arrayWithChildWindowName));
 s:=string(arrayWithChildWindowName);
 if s=windowNameNeedToClickOnGlobal then begin
   SendMessage(w, BM_CLICK, 0, 0);
   PostMessage(w, BM_CLICK, 0, 0);
 end;
end;

вкратце зачем это надо все к примеру надо кликнуть на какой-то кнопке, чтоб не писать
отдельную програмулину и не ждать пока она откомпилируется,
просто пишется xml файл и скармливается моему приложению, ну так вкратце короче.


MBo   (2013-08-01 14:26:00) [8]


function EnumChildWindowsProc(H: hWND; Param: NativeInt): Bool; stdcall;
var
 WindowText: array[0..MAX_PATH] of Char;
begin
 if ((GetWindowText(H, WindowText, 255) <> 0)) then
   TStrings(Param).Add(WindowText);
 Result := True;
end;

procedure TForm1.Button3Click(Sender: TObject);
begin
 EnumChildWindows(Handle, @EnumChildWindowsProc, NativeInt(Memo1.Lines));
end;


RWolf   (2013-08-01 13:03:00) [9]


> что в последнем параметре?

обычно там адрес объекта, вызвавшего эту функцию.
а кладут его туда, чтобы из коллбэка вызывать метод этого же объекта.


Styx   (2013-08-01 12:55:00) [10]


> ну это как-то обойду,

Да не надо это обходить, речь о том, что Вы делаете что-то не то, что задумали. Покажите Ваш callBackFunction.


Den   (2013-08-01 12:40:00) [11]

Эту функцию не нужно вызывать в цикле. - ну это как-то обойду, но всетаки, если можно, в двух словах, почему?


MBo   (2013-08-01 10:24:00) [12]

Эту функцию не нужно вызывать в цикле.


Den   (2013-08-01 10:12:00) [13]

Я чего спросил то я ее вызываю в цыкле

for i:=0 to 3 do begin
enumchildwindows(hwnd, @callBackFunction, 1);
end;

сразу после первой итерации i становилось 2, то есть было 0 и сразу 2 потом, заменил последний параметр на 0, enumchildwindows(hwnd, @callBackFunction, 0); зацикливается и ходит по кругу. Почитавши че такое колбэк функции, я узнал что они должны удалять из стека свои параметры после работы (как это происходит, и что это такое, имею очень смутное представление) и вот подозрения у меня а не удаляет ли оно лишнего? Короче странно все это.


icWasya   (2013-08-01 10:02:00) [14]

это может быть всё что угодно.
В качестве callBackFunction ты подаёшь вот такую функцию.
function EnumChildProc(  ahwnd:HWND,  lParam:LPARAM):BOOL;stdcal;
для каждого найденного окна в эту функцию подаётся дескриптор этого окна и вот этот самый параметр.


Наверх

Титульная страница Поиск, карта сайта Написать письмо