Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Начинающим";
Текущий архив: 2014.05.25;
Скачать: [xml.tar.bz2];

Вниз

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;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.49 MB
Время: 0.01 c
15-1385065805
Юрий
2013-11-22 00:30
2014.05.25
С днем рождения ! 22 ноября 2013 пятница


2-1375798951
mfender
2013-08-06 18:22
2014.05.25
Появляются лишние символы при отправке TIdMultiPartFormDataStream


2-1375632164
NewOne
2013-08-04 20:02
2014.05.25
Проверка на существование


3-1298639170
Очень злой
2011-02-25 16:06
2014.05.25
Проблема с запросом.


15-1384896605
Юрий
2013-11-20 01:30
2014.05.25
С днем рождения ! 20 ноября 2013 среда





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