Sreen Log

Тема в разделе "WASM.WIN32", создана пользователем xsnatch, 14 авг 2004.

  1. xsnatch

    xsnatch New Member

    Публикаций:
    0
    Регистрация:
    24 апр 2004
    Сообщения:
    8
    Пытаюсь сделать прогу, которая делает снимок экрана. У меня есть исходник подобной вещи, но не работает. Вот что есть:


    Код (Text):
    1. .486
    2.  
    3. .model flat, stdcall
    4. option casemap:none
    5.  
    6. CapScreen proto :DWORD
    7.  
    8. include E:\masm32\INCLUDE\windows.inc
    9. include E:\masm32\INCLUDE\user32.inc
    10. include E:\masm32\INCLUDE\kernel32.inc
    11. include E:\masm32\INCLUDE\gdi32.inc
    12. include E:\masm32\INCLUDE\masm32.inc
    13. include E:\masm32\INCLUDE\debug.inc
    14. includelib E:\masm32\LIB\user32.lib
    15. includelib E:\masm32\LIB\kernel32.lib
    16. includelib E:\masm32\LIB\gdi32.lib
    17. includelib E:\masm32\LIB\masm32.lib
    18. includelib E:\masm32\LIB\debug.lib
    19.  
    20. .const
    21. szFile        db "my.bmp",0
    22. szDisplay     db "DISPLAY",0
    23. szNoDC        db "Couldn''t create device context.",0
    24. szNoMemDC     db "Couldn''t create compatible device context.",0
    25. szNoBMP       db "Couldn''t create compatible bitmap.",0
    26. szNoObj       db "Couldn''t select bitmap.",0
    27. szNoCopy      db "Couldn''t copy bitmap.",0
    28. szNoFile      db "Couldn''t write file to disk.",0
    29. szDone        db "Bitmap captured to disk file.",0
    30.  
    31. .code
    32. CapScreen Proc lpFileName:DWORD
    33.     LOCAL hdc:HDC
    34.     LOCAL memdc:HDC
    35.     LOCAL hFile:HANDLE
    36.     LOCAL dwBytes:DWORD
    37.     LOCAL bitmapfileheader:BITMAPFILEHEADER
    38.     LOCAL bitmapinfoheader:BITMAPINFOHEADER
    39.     LOCAL colors[2]:RGBQUAD
    40.     LOCAL bmpinfo:BITMAPINFO
    41.     LOCAL hBitmap:HBITMAP
    42.     LOCAL pBits:DWORD
    43.     LOCAL dwWidth:DWORD
    44.     LOCAL dwHeight:DWORD
    45.     LOCAL dwNumColors:DWORD
    46.     LOCAL dwBPP:DWORD
    47.     LOCAL ColorSize:DWORD
    48.    
    49.             invoke CreateDC, addr szDisplay, NULL, NULL, NULL
    50.             mov hdc,eax
    51.             .IF (eax==NULL)
    52.                 invoke MessageBox, 0, addr szNoDC, NULL, 0
    53.                 jmp ExitFunc
    54.             .ENDIF
    55.             invoke GetDeviceCaps, hdc, HORZRES
    56.             mov dwWidth,eax
    57.             invoke GetDeviceCaps, hdc, VERTRES
    58.             mov dwHeight,eax
    59.             invoke GetDeviceCaps, hdc, BITSPIXEL
    60.             ;mov dwBPP,eax
    61.             mov dwBPP, 1h
    62.             PrintHex dwBPP
    63.             .IF (eax<=8)
    64.                 invoke GetDeviceCaps, hdc, NUMCOLORS
    65.                 mov dwNumColors,eax
    66.                 mov dwNumColors,256 ;this one looks bad
    67.             .ELSE
    68.                 mov dwNumColors,0
    69.             .ENDIF
    70.             invoke CreateCompatibleDC, hdc
    71.             mov memdc,eax
    72.             .IF (eax==NULL)
    73.                 invoke DeleteDC, hdc
    74.                 invoke MessageBox, 0, addr szNoMemDC, NULL, 0
    75.                 jmp ExitFunc
    76.             .ENDIF
    77.             mov bmpinfo.bmiHeader.biSize,sizeof BITMAPINFOHEADER
    78.             mov eax,dwWidth
    79.             mov bmpinfo.bmiHeader.biWidth,eax
    80.             mov eax,dwHeight
    81.             mov bmpinfo.bmiHeader.biHeight,eax
    82.             mov bmpinfo.bmiHeader.biPlanes,1
    83.             mov ax,word ptr [dwBPP]
    84.             ;mov ax, 1
    85.             mov bmpinfo.bmiHeader.biBitCount,ax
    86.             PrintHex bmpinfo.bmiHeader.biBitCount
    87.             mov bmpinfo.bmiHeader.biCompression,BI_RGB
    88.             mov bmpinfo.bmiHeader.biSizeImage,0
    89.             mov bmpinfo.bmiHeader.biXPelsPerMeter,0
    90.             mov bmpinfo.bmiHeader.biYPelsPerMeter,0
    91.             mov eax,dwNumColors
    92.             mov bmpinfo.bmiHeader.biClrUsed,eax
    93.             PrintHex bmpinfo.bmiHeader.biClrUsed
    94.             mov bmpinfo.bmiHeader.biClrImportant,eax
    95.             ;invoke CreateDIBSection,hdc,addr bmpinfo, DIB_PAL_COLORS,addr pBits, NULL, 0
    96.             invoke CreateDIBSection,hdc,addr bmpinfo, DIB_RGB_COLORS,addr pBits, NULL, 0
    97.             mov hBitmap,eax
    98.             .IF (eax==NULL)
    99.                 invoke DeleteDC, hdc
    100.                 invoke DeleteDC, memdc
    101.                 invoke MessageBox, 0, addr szNoBMP, NULL, 0
    102.                 jmp ExitFunc
    103.             .ENDIF
    104.             invoke SelectObject, memdc, hBitmap
    105.             .IF (eax==NULL) || (eax==GDI_ERROR)
    106.                 invoke DeleteDC, hdc
    107.                 invoke DeleteDC, memdc
    108.                 invoke MessageBox, 0, addr szNoObj, NULL, 0
    109.                 jmp ExitFunc
    110.             .ENDIF
    111.             invoke BitBlt, memdc, 0,0, dwWidth, dwHeight, hdc, 0,0, SRCCOPY
    112.             .IF (!eax)
    113.                 invoke DeleteDC, hdc
    114.                 invoke DeleteDC, memdc
    115.                 invoke MessageBox, 0, addr szNoCopy, NULL, 0
    116.                 jmp ExitFunc
    117.             .ENDIF
    118.             mov eax,dwNumColors
    119.             .IF (eax!=0)
    120.                 invoke GetDIBColorTable, memdc, 0, dwNumColors, addr colors
    121.                 mov dwNumColors,eax
    122.             .ENDIF
    123.             mov bitmapfileheader.bfType,4D42h
    124.             mov eax,dwNumColors
    125.             xor edx,edx
    126.             mov ecx,sizeof RGBQUAD
    127.             mul ecx
    128.             mov ColorSize,eax
    129.             mov eax,dwWidth
    130.             xor edx,edx
    131.             mov ecx,dwHeight
    132.             mul ecx
    133.             xor edx,edx
    134.             mov ecx,dwBPP
    135.             mul ecx
    136.             shr eax,3
    137.             add eax,ColorSize
    138.             add eax,sizeof BITMAPFILEHEADER
    139.             add eax,sizeof BITMAPINFOHEADER
    140.             mov bitmapfileheader.bfSize,eax
    141.             mov bitmapfileheader.bfReserved1,0
    142.             mov bitmapfileheader.bfReserved2,0
    143.             mov eax,ColorSize
    144.             add eax,sizeof BITMAPFILEHEADER
    145.             add eax,sizeof BITMAPINFOHEADER
    146.             mov bitmapfileheader.bfOffBits,eax
    147.             mov bitmapinfoheader.biSize,sizeof BITMAPINFOHEADER
    148.             mov eax,dwWidth
    149.             mov bitmapinfoheader.biWidth,eax
    150.             mov eax,dwHeight
    151.             mov bitmapinfoheader.biHeight,eax
    152.             mov bitmapinfoheader.biPlanes,1
    153.             mov ax,word ptr [dwBPP]
    154.             mov bitmapinfoheader.biBitCount,ax
    155.             mov bitmapinfoheader.biCompression,BI_RGB
    156.             mov bitmapinfoheader.biSizeImage,0
    157.             mov bitmapinfoheader.biXPelsPerMeter,0
    158.             mov bitmapinfoheader.biYPelsPerMeter,0
    159.             mov eax,dwNumColors
    160.             mov bitmapinfoheader.biClrUsed,eax
    161.             mov bitmapinfoheader.biClrImportant,0
    162.             invoke CreateFile, lpFileName,GENERIC_WRITE,0, NULL,CREATE_ALWAYS,FILE_ATTRIBUTE_NORMAL,NULL
    163.             mov hFile,eax
    164.             .IF (eax==INVALID_HANDLE_VALUE)
    165.                 invoke DeleteObject, hBitmap
    166.                 invoke DeleteDC, memdc
    167.                 invoke DeleteDC, hdc
    168.                 invoke MessageBox, 0, addr szNoFile, NULL, 0
    169.                 jmp ExitFunc
    170.             .ENDIF
    171.             invoke WriteFile, hFile, addr bitmapfileheader, sizeof BITMAPFILEHEADER, addr dwBytes, NULL
    172.             invoke WriteFile, hFile, addr bitmapinfoheader, sizeof BITMAPINFOHEADER, addr dwBytes, NULL
    173.             mov eax,dwNumColors
    174.             .IF (eax!=0)
    175.                 invoke WriteFile, hFile, addr colors, ColorSize, addr dwBytes,NULL
    176.             .ENDIF
    177.             mov eax,dwWidth
    178.             xor edx,edx
    179.             mov ecx,dwHeight
    180.             mul ecx
    181.             xor edx,edx
    182.             mov ecx,dwBPP
    183.             mul ecx
    184.             shr eax,3
    185.             mov ColorSize,eax
    186.             invoke WriteFile, hFile, pBits, ColorSize, addr dwBytes,NULL
    187.             invoke CloseHandle, hFile
    188.             invoke MessageBox, 0, addr szDone, NULL, 0
    189.             invoke DeleteObject ,hBitmap
    190.             invoke DeleteDC, memdc
    191.             invoke DeleteDC, hdc
    192. ExitFunc:
    193.             ret
    194. CapScreen endp
    195.  
    196. start:
    197.     invoke CapScreen, addr szFile
    198.     invoke  ExitProcess, 0
    199. end start
     
  2. q_q

    q_q New Member

    Публикаций:
    0
    Регистрация:
    5 окт 2003
    Сообщения:
    1.706
    xsnatch

    Сделал так:
    Код (Text):
    1. mov dwBPP,eax
    2. ;mov dwBPP, 1h
    проверял под w2ksp4 1280x1024x32bpp - работает.