Форум: "Начинающим";
Текущий архив: 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