Код (Text): format PE CONSOLE include 'win32ax.inc' .data horizontal dd 0 vertical dd 0 buffer rb 256 .code main: stdcall GetDesktopResolution, horizontal, vertical cinvoke wsprintf, buffer, 'Resolution:%dx%d', [horizontal], [vertical] invoke MessageBox, HWND_DESKTOP, buffer, '', MB_OK ret proc GetDesktopResolution horizontal, vertical locals rc RECT endl pushad invoke GetDesktopWindow invoke GetWindowRect, eax, addr rc mov eax,[rc.right] mov ecx,[rc.bottom] mov esi,[horizontal] mov edi,[vertical] mov [esi], eax mov [edi], ecx popad ret endp .end main Нашёл исходник. Во первых заменил кривое PE CONSOLE на GUI, и сразу же начали косяки. Что за мода такая ret закрывать процесс? Или это имеет смысл? Изменил на invoke ExitProcess,0 как положенно. Однако почему под win32 "ret" ошибки выдаёт? Я совсем недавно слышал высказывание (касательно Pascal), что процедура в отличае от функции ничего не возвращает. proc GetDesktopResolution horizontal, vertical — имхо возвращет! ))) Вот что я совсем не догоняю, так это локальность! locals rc RECT endl Зачем в таком маленьком кусочке кода какие-то условности? Есть ли альтернативные примеры по вычислению размеров экрана с другими апи? Вывод не обязательно в MsgBox, лучше сразу с записью в реестр. Особенно в REG_BINARY виде приветствуемо... )
Хелп! Жарко очень! Код (Text): invoke GetSystemMetrics,SM_CXSCREEN invoke wsprintf,lpOut,'%d',SM_CXSCREEN invoke RegCreateKeyEx,HKEY_LOCAL_MACHINE,'Software\azz',\ NULL,NULL,REG_OPTION_NON_VOLATILE,KEY_WRITE or KEY_READ,NULL,phkResult,NULL invoke RegSetValueEx,phkResult,'\lpValueName',NULL,'REG_SZ',lpOut,100 invoke RegCloseKey,phkResult exit: invoke ExitProcess,0 section '.data' data readable writable phkResult dw ? lpOut rb 1024 Что я натворил? ыы! Не получилось опять! =) --- я знаю что я не то пишу, но я хотяб заготовку написал... --- это ещё ничего, а я представляю если binary надо будет записать, наверное вообще жуть!
Код (Text): int WINAPI GetSystemMetrics( __in int nIndex ); http://msdn.microsoft.com/en-us/library/ms724385%28VS.85%29.aspx Код (Text): LONG WINAPI RegSetValueEx( __in HKEY hKey, __in_opt LPCTSTR lpValueName, __reserved DWORD Reserved, __in DWORD dwType, __in_opt const BYTE *lpData, __in DWORD cbData ); http://msdn.microsoft.com/en-us/library/ms724923%28VS.85%29.aspx а вообще вам нужно начать с книги по программированию судя по всему.
Вас, богатых, не поймёшь. В ассемблерах MASM и FASM волшебное слово "proc" обозначает и процедуры, и функции. Только функция в паскалевском смысле должна возвращать в eax (и в edx, если возвращаемое значение 8-байтное) осмысленное значение, а процедура - не должна. Чтобы в начале исполнения процедуры создать переменную rc на стеке, а после завершения - вычистить её со стека. Работает так же, как локальные переменные в большинстве языков программирования.
Semiono Технически процедкра от функции не отличается ничем, просто то, что в Pascal называется function должно вернуть осмысленное значение в eax, а то, что называется procedure - нет.
SM_CXSCREEN - просто задолбало, что ни получишь всё в каком-то неимоверном виде, потому-что ни в MsgBox не видно, не в реестр не записать, а форматировать wsprintf я не научился. Так как RegSetValueEx() требует указание байта пытался туда втиснуть byte [SM_CXSCREEN] почему-то ругалось, ptr как известно не нужно. Хоть один способ покажите чтоб всякие output выводить в ANSII виде в реестр?
Semiono GetSystemMetrics( SM_CXFULLSCREEN ); еще вариант SM_CXSCREEN - хз что там у тебя не так, таким макаром выставляю свое окошко по центру десктопа и всегда все норм работало! а ты хоть itoa() додумался вызвать что бы мессагу показать?))
Дай мне код!!! Я тоже хочу! Нафиг я тогда мучаюсь ))) itoa() ась? 0_O CXFULLSCREEN рулит! был бы сурс, а там переменных уже мы сами натыкаем потом...
sometime, серьёзно дай мне чем ты окна выставляешь, мне пригодится! Но я в данном случае хочу лоадер зделать для прог... Цель такая, что загрузчик пишет в реестр X Y для любой проги, а потом загружает прогу ShellExecute() Чтоб на любом экране валидно было. Full Screen я почему-то терпеть не могу, именно хочется по размеру экрана. Ну и понятно что записи у прог бывают разные BINARY REG_SZ итп. Я уже на скриптах накатал такое, но мне хочется на асме 8) $x = Binary(0) & Binary(0) & Binary(@DesktopWidth) & Binary(@DesktopHeight-52) & Binary(0) RegWrite("HKCU\Software\VirtualDub.org\VirtualDub\Window Placement", "Main window", "REG_BINARY", $x) ShellExecute(@ProgramFilesDir & "\VirtualDub\Veedub64.exe", $CmdLineRaw) $CmdLineRaw - вот такое на асме исполнить тоже головоломка )) - иду читать мсдн...
я бы с реестром не связывался_ИМХО) Код (Text): HWND hTargetWnd; main() { PROCESS_INFORMATION pi; CreateProcess( ...&pi ); EnumWindows( EnumWndProc, pi.ProcessId); SetWindowPos( hTargetWnd ); } CALLBACK EnumWndProc( hWnd, lParam ) { if (lParam == GetWindowThreadProcessId( hWnd )) return FALSE; hTargetWnd = hWnd; } что имелось ввиду - создали процесс, имеем его пид - проэнумили все окна в системе и поспрашивали пид, совпал - нашли окно, сохранили в глобальную переменную хендл. потом изменили размер. Ну а размер уже какой хош такой и устанавливаешь
Semiono так что бы вы почитали мсдн и всетаки разобрались что к чему,) Смысл тот же - вызвать апи виндоза.
Код (Text): include '%fasm%\win32ax.inc' section '.code' executable start: invoke WinExec, "notepad.exe", SW_SHOWNORMAL exit: invoke ExitProcess, 0 section '.idata' import readable library kernel32,'KERNEL32.DLL' include '%fasm%\api\kernel32.inc' Вот это я понимаю, всегда бы так! ))) Хотел я CreateProcess() запустить, застолбил все поля NULL... так как STARTUPINFOEX structure и PROCESS_INFORMATION меня убивают. Но не открылось оно! ) -- &pi - неужели надо структуру самому написать опять? Ох, уж макросы для чего тогда, геморой.
Код (Text): include '%fasm%\win32ax.inc' section '.code' executable start: invoke ExpandEnvironmentStrings,lp1,lp2,MAX_PATH invoke CreateProcess,lp2,NULL,NULL,NULL,FALSE,\ NORMAL_PRIORITY_CLASS,NULL,NULL,sinfo,pinfo exit: invoke ExitProcess,NULL section '.data' readable writable pinfo PROCESS_INFORMATION sinfo STARTUPINFO lp1 db '%ProgramFiles%\WinRAR\WinRAR.exe',0 lp2 dw MAX_PATH section '.idata' import readable library kernel32,'KERNEL32.DLL',user32,'USER32.DLL' include '%fasm%\api\kernel32.inc' include '%fasm%\api\user32.inc' :P Оказывается нельзя PROCESS_INFORMATION напрямую записывать в invoke... Кстати, а db строки нельзя в invoke корректно записать? Типа чтоб ноль закрывал строку, ато влом section '.data' создавать для каждой мелочи.
Код (Text): .data cif STARTUPINFO <> pi PROCESS_INFORMATION <> section '.text' code readable executable start: invoke CreateProcess, "c:\\windows\\notepad.exe",NULL,NULL,NULL,FALSE,NULL,NULL,NULL,cif,pi Только имя указал