Добрый день! invoke FindWindow, addr class, 0 mov Phandle,eax invoke EnumChildWindows, Phandle, EnumProc,0 EnumProc proc Chandle:dword local buffer[256]:byte local clname[64]:byte invoke GetWindowText, Chandle, addr buffer, 255 invoke lstrcmp, addr buffer, addr drivv or eax,eax jnz NextCWin mov ebx,Chandle invoke SendMessage, Chandle, WM_LBUTTONDOWN, 0,0 invoke SendMessage, Chandle, WM_LBUTTONUP,0,0 jmp @F NextCWin: mov eax, Chandle @@: ret EnumProc endp Столкнулся с проблемой зависания EnumChildWindows..Смысл программы в двух словах- нахожу окно, ищу на нем кнопку нажимаю ее, далее открывается другое окно поверх первого, но у меня дальше этого Enum`a никуда не идет..
Нарушена модель возврата, изза того что не верный прототип, искажается стек. У калбака два параметра: http://msdn.microsoft.com/en-us/library/ms633493(VS.85).aspx Обычно в процедуру обратного вызова передаётся пользовательский параметр, тут также.
ты его сам задаешь в ноль invoke EnumChildWindows, Phandle, EnumProc,0 этот ноль и будет передан как второй параметр функции EnumProc. просто произвольный контекст
Code (Text): invoke EnumChildWindows,eax,Enumerator,NULL proc Enumerator,hWnd:D,lParam:D local buffon du 256 dup (?) xor ebx,ebx invoke GetWindowText,[hWnd],addr buffon,10 cmp eax,ebx jz @F lea esi,[buffon] mov edi,fView mov ecx,5 repz cmpsd cmp ecx,ebx jnz @F stdcall Prepare,[hWnd] stdcall GetSizeOfText,[hWnd] invoke SetWindowLong,[hWnd],GWL_WNDPROC,MyPaint mov [DesktopHWND],eax mov eax,FALSE ret @@: mov eax,TRUE ret endp Вот и пример.... Обрати внимание на конец процедуры, где возвращается тру или фолсе.
Только это - фасм, но переписывать надо будет не так уж много. FALSE - если тебе больше не надо перечислять чилды.
Z3N Здесь возвращается хэндл окна - ненулевое значение, поэтому всё работает. Но конечно возвратить TRUE было бы правильнее.
Code (Text): ;@echo off ;goto make format PE GUI 4.0 entry start include '%fasminc%\win32a.inc' INFINITE = 0FFFFFFFFh ; Infinite timeout section '.code' code readable executable align 4 proc EnumChildWindowsFunc, hwnd, lParam .Buff rb 64 enter lea eax, [.Buff] invoke GetWindowText, [hwnd], eax, 64 lea eax, [.Buff] invoke lstrcmpi, ButtonText, eax test eax, eax jnz @F invoke SendMessage, [hwnd], WM_LBUTTONDOWN, 1, 0 invoke SendMessage, [hwnd], WM_LBUTTONUP, 1, 0 xor eax, eax jmp .finish @@: xor eax, eax inc eax .finish: return endp align 4 proc EnumWindowsFunc, hwnd, lParam .Buff rb 256 .WndRect RECT enter lea eax, [.Buff] invoke GetWindowText, [hwnd], eax, 256 lea eax, [.Buff] invoke lstrcmpi, WindowText, eax test eax, eax jnz @F lea eax, [.WndRect] invoke GetWindowRect, [hwnd], eax push TRUE mov eax, [.WndRect.bottom] sub eax, [.WndRect.top] push eax mov eax, [.WndRect.right] sub eax, [.WndRect.left] push eax push 150 push 200 push [hwnd] call [MoveWindow] invoke EnumChildWindows, [hwnd], EnumChildWindowsFunc, 0 xor eax, eax jmp .finish @@: xor eax, eax inc eax .finish: return endp align 4 start: mov edi, sBuff invoke GetWindowsDirectory, edi, 260 test eax, eax jz @exit invoke lstrcat, edi, szFileName test eax, eax jz @exit mov [StartupInfo.cb], sizeof.STARTUPINFO xor esi, esi invoke CreateProcess, esi, edi, esi, esi, esi, NORMAL_PRIORITY_CLASS,\ esi, esi, StartupInfo, ProcessInfo test eax, eax jz @exit invoke WaitForInputIdle, [ProcessInfo.hProcess], INFINITE invoke CloseHandle, [ProcessInfo.hThread] invoke CloseHandle, [ProcessInfo.hProcess] invoke EnumWindows, EnumWindowsFunc, esi @exit: invoke ExitProcess, esi section '.data' data readable writeable szFileName db '\Calc.exe',0 WindowText db 'Калькулятор',0 ButtonText db 'Hex',0 section '.udata' readable writeable StartupInfo STARTUPINFO ProcessInfo PROCESSINFO sBuff rb 260 section '.idata' import data readable library kernel32,'KERNEL32.DLL',\ user32,'USER32.DLL' include '%fasminc%\APIA\KERNEL32.INC' include '%fasminc%\APIA\USER32.INC' ;:make ;SET PROJECTNAME=StartCalculator ;if exist %PROJECTNAME%.exe del %PROJECTNAME%.exe ;C:\FasmC\fasm.exe %PROJECTNAME%.bat %PROJECTNAME%.exe ;pause ;cls
Не пойму, что здесь вообще обсуждать, причем так долго. Неужели это "проблема EnumChildWindow" - внимательно прочитать справку в MSDN ? Такая короткая и ясная справка...