.486
.model flat, stdcall
option casemap:none
CapScreen proto :DWORD
include E:\masm32\INCLUDE\windows.inc
include E:\masm32\INCLUDE\user32.inc
include E:\masm32\INCLUDE\kernel32.inc
include E:\masm32\INCLUDE\gdi32.inc
include E:\masm32\INCLUDE\masm32.inc
include E:\masm32\INCLUDE\debug.inc
includelib E:\masm32\LIB\user32.lib
includelib E:\masm32\LIB\kernel32.lib
includelib E:\masm32\LIB\gdi32.lib
includelib E:\masm32\LIB\masm32.lib
includelib E:\masm32\LIB\debug.lib
.const
szFile db "my.bmp",0
szDisplay db "DISPLAY",0
szNoDC db "Couldn''t create device context.",0
szNoMemDC db "Couldn''t create compatible device context.",0
szNoBMP db "Couldn''t create compatible bitmap.",0
szNoObj db "Couldn''t select bitmap.",0
szNoCopy db "Couldn''t copy bitmap.",0
szNoFile db "Couldn''t write file to disk.",0
szDone db "Bitmap captured to disk file.",0
.code
CapScreen Proc lpFileName:DWORD
LOCAL hdc:HDC
LOCAL memdc:HDC
LOCAL hFile:HANDLE
LOCAL dwBytes:DWORD
LOCAL bitmapfileheader:BITMAPFILEHEADER
LOCAL bitmapinfoheader:BITMAPINFOHEADER
LOCAL colors[2]:RGBQUAD
LOCAL bmpinfo:BITMAPINFO
LOCAL hBitmap:HBITMAP
LOCAL pBits:DWORD
LOCAL dwWidth:DWORD
LOCAL dwHeight:DWORD
LOCAL dwNumColors:DWORD
LOCAL dwBPP:DWORD
LOCAL ColorSize:DWORD
invoke CreateDC, addr szDisplay, NULL, NULL, NULL
mov hdc,eax
.IF (eax==NULL)
invoke MessageBox, 0, addr szNoDC, NULL, 0
jmp ExitFunc
.ENDIF
invoke GetDeviceCaps, hdc, HORZRES
mov dwWidth,eax
invoke GetDeviceCaps, hdc, VERTRES
mov dwHeight,eax
invoke GetDeviceCaps, hdc, BITSPIXEL
;mov dwBPP,eax
mov dwBPP, 1h
PrintHex dwBPP
.IF (eax<=8)
invoke GetDeviceCaps, hdc, NUMCOLORS
mov dwNumColors,eax
mov dwNumColors,256 ;this one looks bad
.ELSE
mov dwNumColors,0
.ENDIF
invoke CreateCompatibleDC, hdc
mov memdc,eax
.IF (eax==NULL)
invoke DeleteDC, hdc
invoke MessageBox, 0, addr szNoMemDC, NULL, 0
jmp ExitFunc
.ENDIF
mov bmpinfo.bmiHeader.biSize,sizeof BITMAPINFOHEADER
mov eax,dwWidth
mov bmpinfo.bmiHeader.biWidth,eax
mov eax,dwHeight
mov bmpinfo.bmiHeader.biHeight,eax
mov bmpinfo.bmiHeader.biPlanes,1
mov ax,word ptr [dwBPP]
;mov ax, 1
mov bmpinfo.bmiHeader.biBitCount,ax
PrintHex bmpinfo.bmiHeader.biBitCount
mov bmpinfo.bmiHeader.biCompression,BI_RGB
mov bmpinfo.bmiHeader.biSizeImage,0
mov bmpinfo.bmiHeader.biXPelsPerMeter,0
mov bmpinfo.bmiHeader.biYPelsPerMeter,0
mov eax,dwNumColors
mov bmpinfo.bmiHeader.biClrUsed,eax
PrintHex bmpinfo.bmiHeader.biClrUsed
mov bmpinfo.bmiHeader.biClrImportant,eax
;invoke CreateDIBSection,hdc,addr bmpinfo, DIB_PAL_COLORS,addr pBits, NULL, 0
invoke CreateDIBSection,hdc,addr bmpinfo, DIB_RGB_COLORS,addr pBits, NULL, 0
mov hBitmap,eax
.IF (eax==NULL)
invoke DeleteDC, hdc
invoke DeleteDC, memdc
invoke MessageBox, 0, addr szNoBMP, NULL, 0
jmp ExitFunc
.ENDIF
invoke SelectObject, memdc, hBitmap
.IF (eax==NULL) || (eax==GDI_ERROR)
invoke DeleteDC, hdc
invoke DeleteDC, memdc
invoke MessageBox, 0, addr szNoObj, NULL, 0
jmp ExitFunc
.ENDIF
invoke BitBlt, memdc, 0,0, dwWidth, dwHeight, hdc, 0,0, SRCCOPY
.IF (!eax)
invoke DeleteDC, hdc
invoke DeleteDC, memdc
invoke MessageBox, 0, addr szNoCopy, NULL, 0
jmp ExitFunc
.ENDIF
mov eax,dwNumColors
.IF (eax!=0)
invoke GetDIBColorTable, memdc, 0, dwNumColors, addr colors
mov dwNumColors,eax
.ENDIF
mov bitmapfileheader.bfType,4D42h
mov eax,dwNumColors
xor edx,edx
mov ecx,sizeof RGBQUAD
mul ecx
mov ColorSize,eax
mov eax,dwWidth
xor edx,edx
mov ecx,dwHeight
mul ecx
xor edx,edx
mov ecx,dwBPP
mul ecx
shr eax,3
add eax,ColorSize
add eax,sizeof BITMAPFILEHEADER
add eax,sizeof BITMAPINFOHEADER
mov bitmapfileheader.bfSize,eax
mov bitmapfileheader.bfReserved1,0
mov bitmapfileheader.bfReserved2,0
mov eax,ColorSize
add eax,sizeof BITMAPFILEHEADER
add eax,sizeof BITMAPINFOHEADER
mov bitmapfileheader.bfOffBits,eax
mov bitmapinfoheader.biSize,sizeof BITMAPINFOHEADER
mov eax,dwWidth
mov bitmapinfoheader.biWidth,eax
mov eax,dwHeight
mov bitmapinfoheader.biHeight,eax
mov bitmapinfoheader.biPlanes,1
mov ax,word ptr [dwBPP]
mov bitmapinfoheader.biBitCount,ax
mov bitmapinfoheader.biCompression,BI_RGB
mov bitmapinfoheader.biSizeImage,0
mov bitmapinfoheader.biXPelsPerMeter,0
mov bitmapinfoheader.biYPelsPerMeter,0
mov eax,dwNumColors
mov bitmapinfoheader.biClrUsed,eax
mov bitmapinfoheader.biClrImportant,0
invoke CreateFile, lpFileName,GENERIC_WRITE,0, NULL,CREATE_ALWAYS,FILE_ATTRIBUTE_NORMAL,NULL
mov hFile,eax
.IF (eax==INVALID_HANDLE_VALUE)
invoke DeleteObject, hBitmap
invoke DeleteDC, memdc
invoke DeleteDC, hdc
invoke MessageBox, 0, addr szNoFile, NULL, 0
jmp ExitFunc
.ENDIF
invoke WriteFile, hFile, addr bitmapfileheader, sizeof BITMAPFILEHEADER, addr dwBytes, NULL
invoke WriteFile, hFile, addr bitmapinfoheader, sizeof BITMAPINFOHEADER, addr dwBytes, NULL
mov eax,dwNumColors
.IF (eax!=0)
invoke WriteFile, hFile, addr colors, ColorSize, addr dwBytes,NULL
.ENDIF
mov eax,dwWidth
xor edx,edx
mov ecx,dwHeight
mul ecx
xor edx,edx
mov ecx,dwBPP
mul ecx
shr eax,3
mov ColorSize,eax
invoke WriteFile, hFile, pBits, ColorSize, addr dwBytes,NULL
invoke CloseHandle, hFile
invoke MessageBox, 0, addr szDone, NULL, 0
invoke DeleteObject ,hBitmap
invoke DeleteDC, memdc
invoke DeleteDC, hdc
ExitFunc:
ret
CapScreen endp
start:
invoke CapScreen, addr szFile
invoke ExitProcess, 0
end start
Копироапние Изображения Экрана
Люди почему эта программа копирования экрана работает не совсем корректно и выдает старнную картинку место нормальной. На Масм32:confused:
Код:
;mov dwBPP,eax
mov dwBPP, 1h
mov dwBPP, 1h
А если наоборот?
Цитата: Goodwin98
Код:
;mov dwBPP,eax
mov dwBPP, 1h
mov dwBPP, 1h
А если наоборот?
Наоборот тоже пробовал, но тогда в место всего изображения экрана высвечиваются только ярлыки
Попробуйте как вариант вместо CreateDC вызывать invoke GetDC,0
Просто интересно а почему вы подумали, что 1 бит на пиксел сделает вам хорошую картинку?
Код:
;mov dwBPP,eax
mov dwBPP, 1h
mov dwBPP, 1h
Вот такой синий экран при mov dwBPP, 1h в my1.jpg
А при mov dwBPP,eax Одни ярлычки а весь остальной экран черный
Да еще один момент У меня возможно сгорела видео карта)))) Потому что в любую игру Наприме Battle Filed я могу играть максимум две минуту а потом виснет насмерть((( Но так без игр просто в Винде ничего такого не происходит. Может быть причина в этом?
Код:
mov dwBPP, 10h ;То есть 10h = 16 в десятичной системе
А до этого стояло
mov dwBPP, eax ; и равно он было eax=20h то есть 32h
И поэтому видимо не Капилось
А до этого стояло
mov dwBPP, eax ; и равно он было eax=20h то есть 32h
И поэтому видимо не Капилось
Незнаю почему но сработало. Только единственное Не фоткается панель задая почему-то.
Все и панель теперь тоже Капчится у меня оказывается была включена полупрозрачность.