Код (Text): include '%fasm%\win32ax.inc' start: pushad invoke FindWindow,"SciCalc",NULL mov [hWnd],eax invoke FindWindowEx,[hWnd],NULL,NULL,4 mov [cWnd],eax invoke SendMessage,[cWnd],WM_LBUTTONDOWN,NULL,NULL popad exit: invoke ExitProcess,NULL section '.idata' import data readable writeable library kernel32,'KERNEL32.DLL',user32,'USER32.DLL' include '%fasm%\api\kernel32.inc' include '%fasm%\api\user32.inc' cWnd dd ? hWnd dd ? Пытаюсь тиснуть в калькулятор, много ли косяков понаделал тут?
На четверку хочешь нажать? Код (Text): include '%fasm%\win32ax.inc' start: pushad invoke FindWindow,"SciCalc",NULL mov [hWnd],eax invoke FindWindowEx,[hWnd],NULL,NULL,button mov [cWnd],eax invoke SendMessage,[cWnd],BM_CLICK,NULL,NULL popad exit: invoke ExitProcess,NULL section '.idata' import data readable writeable library kernel32,'KERNEL32.DLL',user32,'USER32.DLL' include '%fasm%\api\kernel32.inc' include '%fasm%\api\user32.inc' cWnd dd ? hWnd dd ? button db '4', 0
Ай какой ты молодец! 5+ А вот pushad / popad это действительно помогает или ненужный тут код? =) Я просто чё-то помню что регистры надо сохранять, хотя не разу не видел, чтоб кто-то в таких случая pushad использовал, вообщем это я наобум написал =)
Код (Text): start: invoke ShellExecute,NULL,NULL,'calc.exe',NULL,NULL,SW_SHOW invoke Sleep,20 invoke FindWindow,"SciCalc",NULL mov [hWnd],eax invoke FindWindowEx,[hWnd],NULL,NULL,button mov [cWnd],eax invoke SendMessage,[cWnd],BM_CLICK,NULL,NULL Sleep() выручил, но может быть что-то удачнее есть или тут нет вариантов?
когда-то баловался Код (Text): 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'
Код (Text): start: invoke ShellExecute,NULL,NULL,'desk.cpl',NULL,NULL,SW_SHOW invoke Sleep,200 invoke FindWindow,"#32770",NULL Открыл desk.cpl ресхакером, а там всего одно окно (rundll32.exe shell32.dll,Control_RunDLL desk.cpl,,1) видимо поэтому в окне под кодовым названием )) desk.cpl,,-1 нажать button1 не получается... Что за фокусы с этими CPL? Asterix, спасибо большое за пример!
Код (Text): section '.udata' readable writeable ProcessInfo PROCESSINFO это откуда? у меня глючит. Error: Illegal Instruction
так и есть ProcessInfo PROCESS_INFORMATION надо дело в том что сорц писался давно, в старых версиях фасма компилилось, там как раз было такое неправильное имя структуры
поправил Код (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 locals .Buff rb 64 endl 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: ret endp align 4 proc EnumWindowsFunc, hwnd, lParam locals .Buff rb 256 .WndRect RECT endl 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: ret endp align 4 start: xor esi, esi mov edi, sBuff invoke GetSystemDirectory, edi, 260 test eax, eax jz @exit invoke lstrcat, edi, szFileName test eax, eax jz @exit mov [StartupInfo.cb], sizeof.STARTUPINFO 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 PROCESS_INFORMATION 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:\Fasm\fasm.exe %PROJECTNAME%.bat %PROJECTNAME%.exe ;pause ;cls
Кароче период застоя! Во-первых не уверен нужно ли тут искать FindWindowEx Код (Text): invoke FindWindow,"#32770",NULL mov [hWnd],eax invoke FindWindowEx,[hWnd],NULL,NULL,button Может достаточно FindWindow уровня? Всякие дополнения не помогли, хотя может имеет смысл их далее использовать и в каком порядке? invoke SetActiveWindow,[hWnd] invoke EnableWindow,[hWnd],TRUE invoke SetFocus,[hWnd] ...?? WM_COMMAND - в этом окне наверное нельзя прикрутить, так как меню здесь нет. IDOK и IDCANCEL - это же то же самое что ~ button 0x00000001 ? Или чем-то лучше! Вообщем (Display Properties) окно не реагирует, CPL окна это вам не calc.exe а гораздо хуже :\
#define IDOK 1 #define IDCANCEL 2 #define IDABORT 3 #define IDRETRY 4 #define IDIGNORE 5 #define IDYES 6 #define IDNO 7 заглянь на дефайны и все станет на свои места.)
Вот когда всё покатило, мне вспомнилась одна фитча! Последний штрих! Сейчас проверю, но наверное @HIDE тут не поможет, так как внешний процессвызывается, но хотябы его налету скрыть. =) Код (Text): invoke ShellExecute, NULL, NULL, 'rundll32.exe', 'Shell32.dll,Control_RunDLL desk.cpl desk,@Themes Action:OpenTheme /File:"C:\I\Resources\Themes\Blackbox.theme"', NULL, SW_SHOW ,SW_HIDE подставлю! Но может идеи ищё будут?