GetDesktopResolution

Тема в разделе "WASM.BEGINNERS", создана пользователем Semiono, 7 авг 2010.

  1. Semiono

    Semiono Member

    Публикаций:
    0
    Регистрация:
    27 ноя 2005
    Сообщения:
    793
    Код (Text):
    1.         format PE CONSOLE
    2.  
    3.         include 'win32ax.inc'
    4.          
    5. .data
    6.         horizontal dd 0
    7.         vertical dd 0
    8.         buffer rb 256
    9.  
    10. .code
    11. main:
    12.         stdcall GetDesktopResolution, horizontal, vertical
    13.         cinvoke wsprintf, buffer, 'Resolution:%dx%d', [horizontal], [vertical]
    14.         invoke MessageBox, HWND_DESKTOP, buffer, '', MB_OK
    15.         ret
    16.  
    17.  
    18. proc GetDesktopResolution horizontal, vertical
    19.          
    20.         locals
    21.                 rc RECT
    22.         endl
    23.  
    24.         pushad
    25.         invoke GetDesktopWindow
    26.         invoke GetWindowRect, eax, addr rc
    27.         mov eax,[rc.right]
    28.         mov ecx,[rc.bottom]
    29.         mov esi,[horizontal]
    30.         mov edi,[vertical]
    31.         mov [esi], eax
    32.         mov [edi], ecx
    33.         popad
    34.         ret
    35. endp
    36.  
    37. .end main
    Нашёл исходник. :)
    Во первых заменил кривое PE CONSOLE на GUI, и сразу же начали косяки.
    Что за мода такая ret закрывать процесс? Или это имеет смысл?
    Изменил на invoke ExitProcess,0 как положенно. Однако почему под win32 "ret" ошибки выдаёт?

    Я совсем недавно слышал высказывание (касательно Pascal), что процедура в отличае от функции ничего не возвращает.
    proc GetDesktopResolution horizontal, vertical — имхо возвращет! )))

    Вот что я совсем не догоняю, так это локальность!
    locals
    rc RECT
    endl
    Зачем в таком маленьком кусочке кода какие-то условности?

    Есть ли альтернативные примеры по вычислению размеров экрана с другими апи?
    Вывод не обязательно в MsgBox, лучше сразу с записью в реестр.
    Особенно в REG_BINARY виде приветствуемо... )
     
  2. Semiono

    Semiono Member

    Публикаций:
    0
    Регистрация:
    27 ноя 2005
    Сообщения:
    793
    Хелп! Жарко очень!
    Код (Text):
    1.         invoke  GetSystemMetrics,SM_CXSCREEN
    2.         invoke  wsprintf,lpOut,'%d',SM_CXSCREEN
    3.  
    4.         invoke RegCreateKeyEx,HKEY_LOCAL_MACHINE,'Software\azz',\
    5.                NULL,NULL,REG_OPTION_NON_VOLATILE,KEY_WRITE or KEY_READ,NULL,phkResult,NULL
    6.  
    7.         invoke  RegSetValueEx,phkResult,'\lpValueName',NULL,'REG_SZ',lpOut,100
    8.         invoke  RegCloseKey,phkResult
    9. exit:
    10.         invoke  ExitProcess,0
    11.  
    12. section '.data' data readable writable
    13.  
    14. phkResult dw ?
    15. lpOut rb 1024
    Что я натворил? ыы! Не получилось опять! =)
    ---
    я знаю что я не то пишу, но я хотяб заготовку написал...
    ---
    это ещё ничего, а я представляю если binary надо будет записать, наверное вообще жуть!
     
  3. freyr

    freyr New Member

    Публикаций:
    0
    Регистрация:
    23 фев 2010
    Сообщения:
    95
    Код (Text):
    1. int WINAPI GetSystemMetrics(
    2.   __in  int nIndex
    3. );
    http://msdn.microsoft.com/en-us/library/ms724385%28VS.85%29.aspx

    Код (Text):
    1. LONG WINAPI RegSetValueEx(
    2.   __in        HKEY hKey,
    3.   __in_opt    LPCTSTR lpValueName,
    4.   __reserved  DWORD Reserved,
    5.   __in        DWORD dwType,
    6.   __in_opt    const BYTE *lpData,
    7.   __in        DWORD cbData
    8. );
    http://msdn.microsoft.com/en-us/library/ms724923%28VS.85%29.aspx


    а вообще вам нужно начать с книги по программированию судя по всему.
     
  4. n0name

    n0name New Member

    Публикаций:
    0
    Регистрация:
    5 июн 2004
    Сообщения:
    4.336
    Адрес:
    Russia
    и по фасму тоже.
     
  5. JCronuz

    JCronuz New Member

    Публикаций:
    0
    Регистрация:
    26 сен 2007
    Сообщения:
    1.240
    Адрес:
    Russia
    Возвращаемый результат надо проверять
     
  6. CyberManiac

    CyberManiac New Member

    Публикаций:
    0
    Регистрация:
    2 сен 2003
    Сообщения:
    2.473
    Адрес:
    Russia
    Вас, богатых, не поймёшь. В ассемблерах MASM и FASM волшебное слово "proc" обозначает и процедуры, и функции. Только функция в паскалевском смысле должна возвращать в eax (и в edx, если возвращаемое значение 8-байтное) осмысленное значение, а процедура - не должна.

    Чтобы в начале исполнения процедуры создать переменную rc на стеке, а после завершения - вычистить её со стека. Работает так же, как локальные переменные в большинстве языков программирования.
     
  7. qwe8013

    qwe8013 New Member

    Публикаций:
    0
    Регистрация:
    28 май 2009
    Сообщения:
    198
    Semiono
    Технически процедкра от функции не отличается ничем, просто то, что в Pascal называется function должно вернуть осмысленное значение в eax,
    а то, что называется procedure - нет.
     
  8. Semiono

    Semiono Member

    Публикаций:
    0
    Регистрация:
    27 ноя 2005
    Сообщения:
    793
    SM_CXSCREEN - просто задолбало, что ни получишь всё в каком-то неимоверном виде,
    потому-что ни в MsgBox не видно, не в реестр не записать, а форматировать wsprintf я не научился.

    Так как RegSetValueEx() требует указание байта пытался туда втиснуть byte [SM_CXSCREEN]
    почему-то ругалось, ptr как известно не нужно.

    Хоть один способ покажите чтоб всякие output выводить в ANSII виде в реестр?
     
  9. sometime

    sometime Odessa

    Публикаций:
    0
    Регистрация:
    22 апр 2009
    Сообщения:
    227
    Адрес:
    sunday
    Semiono
    GetSystemMetrics( SM_CXFULLSCREEN );
    еще вариант:)

    SM_CXSCREEN - хз что там у тебя не так, таким макаром выставляю свое окошко по центру десктопа и всегда все норм работало!

    а ты хоть itoa() додумался вызвать что бы мессагу показать?))
     
  10. Semiono

    Semiono Member

    Публикаций:
    0
    Регистрация:
    27 ноя 2005
    Сообщения:
    793
    Дай мне код!!! Я тоже хочу! Нафиг я тогда мучаюсь )))

    itoa() ась? 0_O

    CXFULLSCREEN рулит! был бы сурс, а там переменных уже мы сами натыкаем потом... :)
     
  11. Semiono

    Semiono Member

    Публикаций:
    0
    Регистрация:
    27 ноя 2005
    Сообщения:
    793
    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 - вот такое на асме исполнить тоже головоломка )) - иду читать мсдн...
     
  12. sometime

    sometime Odessa

    Публикаций:
    0
    Регистрация:
    22 апр 2009
    Сообщения:
    227
    Адрес:
    sunday
    я бы с реестром не связывался_ИМХО)
    Код (Text):
    1. HWND  hTargetWnd;
    2.  
    3. main()
    4. {
    5. PROCESS_INFORMATION pi;
    6. CreateProcess( ...&pi );
    7.  
    8. EnumWindows( EnumWndProc, pi.ProcessId);
    9. SetWindowPos( hTargetWnd );
    10. }
    11.  
    12. CALLBACK
    13. EnumWndProc( hWnd, lParam )
    14. {
    15.   if (lParam == GetWindowThreadProcessId( hWnd ))
    16.      return FALSE;
    17.  
    18.   hTargetWnd = hWnd;
    19. }
    что имелось ввиду - создали процесс, имеем его пид - проэнумили все окна в системе и поспрашивали пид, совпал - нашли окно, сохранили в глобальную переменную хендл. потом изменили размер. Ну а размер уже какой хош такой и устанавливаешь:)
     
  13. Semiono

    Semiono Member

    Публикаций:
    0
    Регистрация:
    27 ноя 2005
    Сообщения:
    793
    За что ты меня не любишь, зачем это на си написал! =)
     
  14. Semiono

    Semiono Member

    Публикаций:
    0
    Регистрация:
    27 ноя 2005
    Сообщения:
    793
    Вчастности [SM_CXSCREEN] ...через ...wsprint() ??
     
  15. JCronuz

    JCronuz New Member

    Публикаций:
    0
    Регистрация:
    26 сен 2007
    Сообщения:
    1.240
    Адрес:
    Russia
    Вы наверное еще в ядре не видели работу с реестром.
     
  16. sometime

    sometime Odessa

    Публикаций:
    0
    Регистрация:
    22 апр 2009
    Сообщения:
    227
    Адрес:
    sunday
    Semiono
    так что бы вы почитали мсдн и всетаки разобрались что к чему,) Смысл тот же - вызвать апи виндоза.
     
  17. Semiono

    Semiono Member

    Публикаций:
    0
    Регистрация:
    27 ноя 2005
    Сообщения:
    793
    Код (Text):
    1. include '%fasm%\win32ax.inc'
    2.  
    3. section '.code' executable
    4.  
    5. start:
    6.         invoke WinExec, "notepad.exe", SW_SHOWNORMAL
    7. exit:
    8.         invoke ExitProcess, 0
    9.  
    10. section '.idata' import readable
    11.         library kernel32,'KERNEL32.DLL'
    12.         include '%fasm%\api\kernel32.inc'
    Вот это я понимаю, всегда бы так! )))
    Хотел я CreateProcess() запустить, застолбил все поля NULL...
    так как STARTUPINFOEX structure и PROCESS_INFORMATION меня убивают. Но не открылось оно! )

    --
    &pi - неужели надо структуру самому написать опять? Ох, уж макросы для чего тогда, геморой.
     
  18. sometime

    sometime Odessa

    Публикаций:
    0
    Регистрация:
    22 апр 2009
    Сообщения:
    227
    Адрес:
    sunday
    еще бы.)
     
  19. Semiono

    Semiono Member

    Публикаций:
    0
    Регистрация:
    27 ноя 2005
    Сообщения:
    793
    Код (Text):
    1. include '%fasm%\win32ax.inc'
    2.  
    3. section '.code' executable
    4.  
    5. start:
    6.         invoke  ExpandEnvironmentStrings,lp1,lp2,MAX_PATH
    7.  
    8.         invoke  CreateProcess,lp2,NULL,NULL,NULL,FALSE,\
    9.                 NORMAL_PRIORITY_CLASS,NULL,NULL,sinfo,pinfo
    10. exit:
    11.         invoke  ExitProcess,NULL
    12.  
    13. section '.data' readable writable
    14.  
    15. pinfo        PROCESS_INFORMATION
    16. sinfo        STARTUPINFO
    17.  
    18. lp1  db '%ProgramFiles%\WinRAR\WinRAR.exe',0
    19. lp2  dw MAX_PATH
    20.  
    21. section '.idata' import readable
    22.  
    23.         library kernel32,'KERNEL32.DLL',user32,'USER32.DLL'
    24.         include '%fasm%\api\kernel32.inc'
    25.         include '%fasm%\api\user32.inc'
    :P

    Оказывается нельзя PROCESS_INFORMATION напрямую записывать в invoke...
    Кстати, а db строки нельзя в invoke корректно записать? Типа чтоб ноль закрывал строку, ато влом section '.data' создавать для каждой мелочи.
     
  20. JCronuz

    JCronuz New Member

    Публикаций:
    0
    Регистрация:
    26 сен 2007
    Сообщения:
    1.240
    Адрес:
    Russia
    Код (Text):
    1. .data
    2.        cif STARTUPINFO <>
    3.        pi  PROCESS_INFORMATION <>
    4.  
    5. section '.text' code readable executable
    6.  
    7. start:
    8.         invoke CreateProcess, "c:\\windows\\notepad.exe",NULL,NULL,NULL,FALSE,NULL,NULL,NULL,cif,pi
    Только имя указал