1. Вы находитесь в архивной версии форума xaker.name. Здесь собраны темы с 2007 по 2012 год, большинство инструкций и мануалов уже неактуальны.

Assembly FAQ #1

  1. ASM32FAQ #1 & #2




    Ответ 1. Как можно скрыть/показать панель задач?


    Код:
    shell db "Shell_TrayWnd",0 ; это имя класса панели задач
    invoke FindWindow,addr shell,NULL ; получение хэндла панели задач
    .if eax != 0
    invoke ShowWindow,eax,SW_HIDE ; скрытие панели задач, используйте SW_SHOW для показа
    endif
    

    Ответ 2. Как можно сделать недоступной/доступной/показать/скрыть кнопку "Пуск"?

    Код:
    .data?
    buffer db 127 dup(?)
    
    .data
    shell db "Shell_TrayWnd",0
    sbar db "BUTTON",0
    child dd ?
    slen dd ?
    
    .code
    invoke FindWindow,addr shell,NULL ; получение хэндла панели задач
    mov tray, eax
    invoke GetWindow,tray, GW_CHILD ; получение дочерних объектов на панели задач, если таковые имеются
    mov child, eax
    .if child != 0
    invoke GetClassName,child,offset buffer, sizeof buffer ; получение имени класса дочернего объекта
    .if eax > 0
    invoke lstrlen, offset buffer ; получение размера класса дочернего объекта
    mov slen,eax
    invoke CharUpperBuff,offset buffer,slen ; преобразование к верхнему регистру
    invoke lstrcmp,addr buffer, addr sbar ; сравнение имени класса с BUTTON
    .if eax == 0
    invoke ShowWindow,child,SW_HIDE ; скрыть кнопку "Пуск"
    ; invoke ShowWindow,child,SW_SHOW ; показать кнопку "Пуск"
    ; invoke EnableWindow,child,FALSE ; кнопка "Пуск" недоступна
    ; invoke EnableWindow,child,TRUE ; кнопка "Пуск" доступна
    .endif
    .endif
    .endif
    



    Ответ 3. Как сделать окно действительно Stay On Top?
    Код:
    invoke SetWindowPos,hWin, HWND_TOPMOST,NULL,NULL,NULL,NULL,SWP_NOACTIVATE or SWP_NOMOVE or SWP_NOSIZE
    

    Ответ 4. Как создать горячие клавиши? Например CTRL+ALT+A.


    Код:
    .data
    hmsg db "HotKey CTRL + ALT + A Works good!",0
    hcap db "Hotkey Example",0
    
    .code .if uMsg == WM_CREATE
    invoke RegisterHotKey,hWnd,065h,MOD_CONTROL or MOD_ALT, 041h ; CTRL + ALT + A (041h is 65 - 065h is 101)
    
    .elseif uMsg == WM_HOTKEY
    invoke MessageBox,hWin,addr hmsg,addr hcap, MB_OK or MB_ICONINFORMATION
    
    .elseif uMsg == WM_DESTROY
    invoke UnregisterHotKey,hWin,065h
    invoke PostQuitMessage,NULL
    return 0
    .endif
    Ответ 5. Как узнать директорию Windows и системную директорию.

    Код:
    .data
    buffer db 50 dup(?)
    hCap db "WindowsDirectory",0
    
    .code
    invoke GetWindowsDirectory, addr buffer, sizeof buffer ; сохранение директории Windows в буфере
    ; invoke GetSystemDirectory, addr buffer, sizeof buffer ; сохранение системной директории в буфере
    invoke MessageBox,hWnd, addr buffer, addr hCap, MB_OK or MB_ICONINFORMATION
    
    Ответ 6. Как можно открыть меню Старт из моей программы?

    Код:
    invoke SendMessage,hWnd,WM_SYSCOMMAND,SC_TASKLIST,NULL


    Ответ 7. Как закрыть активную программу?

    Код:
    .data
    fwin dd ?
    
    .code
    invoke GetForegroundWindow
    mov fwin,eax
    invoke SendMessage, fwin, WM_CLOSE,NULL
    

    Ответ 8. Как отобразить моё окно без заголовка?

    Код:
    invoke GetWindowLong,hWnd,GWL_STYLE ; получение информации об окне
    and eax,not WS_CAPTION ; удаление WS_CAPTION
    invoke SetWindowLong,hWnd,GWL_STYLE,eax ; установка свойств окна
    

    Ответ 9. Как определить видимо окно или нет?


    Код:
    invoke IsWindowVisible,hWin
    .if eax == TRUE
    ; окно видимо
    .else
    ; окно не видимо
    .endif
    
    Ответ 10. Как скрыть окно?

    Код:
    .data
    mirc db "mIRC32",0
    mhand dd ?
    
    .code
    invoke FindWindow,addr mirc, NULL ; пример для mIRC32
    mov mhand,eax
    .if mhand != 0 ; получен ли хэндл ?
    invoke ShowWindow,mhand,SW_SHOW ; показать окно
    ; invoke ShowWindow,mhand,SW_HIDE ; скрыть окно
    .else
    ; mIRC32 в данный момент не запущен...
    .endif
    

    Ответ 11. Как отобразить окно поверх всех окон?


    Код:
    invoke SetForegroundWindow, mhand
    Ответ 12. Как запретить комбинацию CTRL+ALT+DEL, ALT+TAB+CTRL+ESC?

    Код:
    invoke SystemParametersInfo,SPI_SCREENSAVERRUNNING,1,NULL,NULL
    ; работает только под Windows 98 1 - запретить; 0 - разрешить.
    

    Ответ 13. Как определить включено ли свойство панели задач "Автоматически убирать с экрана"?

    Код:
    .data
    AppBar APPBARDATA {} ; {} означает использовать установки по умолчанию...
    
    
    .code
    mov AppBar.cbSize, sizeof AppBar
    invoke SHAppBarMessage, ABM_GETSTATE, addr AppBar
    and eax, ABS_AUTOHIDE
    .if eax == TRUE
    ; свойство включено
    .else
    ; свойство не включено
    .endif
    

    Ответ 14. Как открыть браузер или почтовую программу, используемые по умолчанию?


    Код:
    .data
    lpPage db "http://win32asm.cjb.net",0
    lpMail db "[email protected]",0
    lpOperation db "open",0
    
    .code
    invoke ShellExecute,hWin,addr lpOperation, addr lpPage, NULL, NULL, SW_SHOWNORMAL
    invoke ShellExecute,hWin,addr lpOperation, addr lpMail, NULL, NULL, SW_SHOWNORMAL
    

    Ответ 15. Как вызвать диалог "Установка соединения" используя Win32 API?

    Код:
    include \MASM32\INCLUDE\mpr.inc
    includelib \MASM32\LIB\mpr.lib
    invoke WNetConnectionDialog,hWnd,RESOURCETYPE_DISK
    
    Ответ 16. Как установить/убить таймер в программе?

    Код:
    invoke SetTimer, hWin, NULL, 3000, NULL ; 3000 ms = 3 secs
    
    .if uMsg == WM_TIMER
    invoke KillTimer, hWin, NULL ; убить таймер если он работает
    

    Ответ 17. Как узнать имя текущего пользователя?


    Код:
    .data
    lpBuffer db 127 dup (?)
    nSize dd sizeof lpBuffer
    mcap db UserName",0
    .code
    invoke GetUserName, addr lpBuffer,addr nSize
    invoke MessageBox,hWin,addr buffer, addr mcap, MB_OK
    

    Ответ 18. Как преобразовать число в строку и отобразить его с помощью MessageBox?


    Код:
    .data
    mystr db 10 dup(?)
    myint dd 15
    caption db "Convertion Example",0
    format db "%d",0
    
    invoke wsprintf, addr mystr, addr format, myint
    invoke MessageBox, NULL, addr mystr, addr caption, MB_OK or MB_ICONINFORMATION
    

    Ответ 19. Как установить/изменить скорость курсора?

    Код:
    invoke SetCaretBlinkTime, 1F4h ; sets it to 500 ms
    

    Ответ 20. Как переключить кнопки мыши?

    Код:
    invoke SystemParametersInfo, SPI_SETMOUSEBUTTONSWAP, 1, NULL, NULL
    invoke SystemParametersInfo, SPI_SETMOUSEBUTTONSWAP, 0, NULL, NULL ; по умолчанию
    

    Ответ 21. Как сделать окно "Stay On DOWN"?


    Код:
    .if uMsg == WM_CREATE
    invoke SetWindowPos, hWin, HWND_BOTTOM, 0, 0, 0, 0, SWP_NOMOVE or SWP_NOSIZE
    .elseif uMsg == WM_WINDOWPOSCHANGED
    invoke SetWindowPos, hWin, HWND_BOTTOM, 0, 0, 0, 0, SWP_NOMOVE or SWP_NOSIZE
    Ответ 22. Как переключить монитор в режим энергосбережения?

    Код:
    invoke SendMessage, hWin, WM_SYSCOMMAND, SC_MONITORPOWER, NULL ; выключить монитор
    invoke SendMessage, hWin, WM_SYSCOMMAND, SC_MONITORPOWER, -1; включить монитор
    
    Ответ 23. Как сделать заголовок окна мигающим (активным-неактивным)?

    Код:
    invoke FlashWindow, hWin, TRUE ; hWin - хэндл окна которое должно мигать
    Ответ 24. Как скачать файл из Интернета?

    Код:
    include \MASM32\INCLUDE\wininet.inc
    includelib \MASM32\LIB\wininet.lib
    
    .data
    fileUrl db "http://delphi.about.com/library/forminbpl.zip",0
    fileSave db "saved.zip",0
    msgOk db "Downloaded Success!",0
    msgErr db "Download Failed!",0
    mcap db "Result",0
    
    .data?
    AppName db 127 dup(?)
    fHand dd ?
    bwrite dd ?
    
    .code
    GetInetFile proc
    LOCAL Buffer[1024]: BYTE
    LOCAL hSession: DWORD
    LOCAL hUrl: DWORD
    LOCAL Bufferlen: DWORD
    invoke GetModuleFileName, hInstance, addr AppName, sizeof AppName
    invoke InternetOpen, addr AppName, INTERNET_OPEN_TYPE_PRECONFIG, NULL, NULL, NULL
    mov hSession, eax
    .if hSession == INVALID_HANDLE_VALUE
    mov eax, FALSE
    ret
    .endif
    invoke InternetOpenUrl, hSession, addr fileUrl, NULL, NULL, NULL, NULL
    mov hUrl, eax
    .if hUrl == INVALID_HANDLE_VALUE
    mov eax, FALSE
    ret
    .endif
    invoke CreateFile, addr fileSave, GENERIC_READ or GENERIC_WRITE, FILE_SHARE_READ,\
    NULL,CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL,NULL
    mov fHand, eax
    .if fHand == INVALID_HANDLE_VALUE
    mov eax, FALSE
    ret
    .endif
    invoke SetFilePointer, fHand, NULL, NULL, FILE_BEGIN
    download:
    invoke InternetReadFile, hUrl, addr Buffer, sizeof Buffer, addr Bufferlen
    .if Bufferlen != 0 
    invoke WriteFile, fHand, addr Buffer, Bufferlen, ADDR bwrite, NULL
    jmp download
    .endif 
    invoke CloseHandle, fHand
    invoke InternetCloseHandle, hUrl
    invoke InternetCloseHandle, hSession
    mov eax, TRUE
    ret
    GetInetFile endp
    
    ; Call this like...
    invoke GetInetFile
    .if eax == TRUE 
    invoke MessageBox, hWin, addr msgOk, addr mcap, MB_OK
    .else
    invoke MessageBox, hWin, addr msgErr, addr mcap, MB_OK
    .endif
    
    asm.shadrinsk.net
     
  2. robo9,
    роб вот это реально! если можно продолжи этот типс энд трикс ваще офигенная тема!
     
  3. Первая и вторая часть этого фака в CHM

    FAQ#1 & #2 Вместе

    Вот выкладываю обе части этого фака. Там один тот который я уже запостил (вин32) и второй (ДОС). Всё удобно сложено в CHM. Качаем, читаем не забываем.