Страница с сайта Владислава Пирогова Ассемблер и не только.

Часто задаваемые вопросы по программированию на ассемблере под Win32


Ответ 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 "ates@anet.net.tr",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