![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
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;
для каждого найденного окна в эту функцию подаётся дескриптор этого окна и вот этот самый параметр.