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

Вниз

enumchildwindows вопрос по последнему параметру   Найти похожие ветки 

 
Den   (2013-08-01 09:41) [0]

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


 
icWasya ©   (2013-08-01 10:02) [1]

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


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

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

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

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


 
MBo ©   (2013-08-01 10:24) [3]

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


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

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


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


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

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


 
RWolf ©   (2013-08-01 13:03) [6]


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

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


 
MBo ©   (2013-08-01 14:26) [7]


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;



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

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

это кусок кода откуда они вызываются
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 файл и скармливается моему приложению, ну так вкратце короче.


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

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


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

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


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

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


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

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


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


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

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


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

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



Страницы: 1 вся ветка

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

Наверх




Память: 0.5 MB
Время: 0.004 c
15-1384939416
Nil
2013-11-20 13:23
2014.05.25
Работа с SQLite


2-1375335686
Den
2013-08-01 09:41
2014.05.25
enumchildwindows вопрос по последнему параметру


2-1375696096
Света
2013-08-05 13:48
2014.05.25
Точный таймер


2-1375104527
Очень Злой
2013-07-29 17:28
2014.05.25
Excel


15-1384704906
Дмитрий СС
2013-11-17 20:15
2014.05.25
Нумерация точек в системе координат.