Как сделать скрин экрана

Тема в разделе "WASM.BEGINNERS", создана пользователем 777user777, 31 янв 2011.

  1. 777user777

    777user777 New Member

    Публикаций:
    0
    Регистрация:
    30 ноя 2010
    Сообщения:
    109
    Как сделать программу на асме,которая будет делать скрин экрана и записывать его в файл?
     
  2. ntkernelspawn

    ntkernelspawn New Member

    Публикаций:
    0
    Регистрация:
    17 дек 2010
    Сообщения:
    61
    google-> assembler screenshot
     
  3. _sheva740

    _sheva740 New Member

    Публикаций:
    0
    Регистрация:
    31 авг 2005
    Сообщения:
    1.539
    Адрес:
    Poland
    777user777
    Вот код функи CreateDib - By Napalm
    Код (Text):
    1. #include <windows.h>
    2. #include <Wingdi.h>
    3.  
    4. // CreateDib - By Napalm
    5. HBITMAP CreateDib(int nWidth, int nHeight, int nBitDepth){
    6.     LPBYTE lpDib;
    7.     HBITMAP hbmDib;
    8.     BITMAPINFO bmiDib = { {
    9.         sizeof(BITMAPINFOHEADER), nWidth, nHeight, 1, nBitDepth, BI_RGB, 0, 0, 0, 0, 0,
    10.     } };
    11.    
    12.     HDC hdcScreen = GetDC(HWND_DESKTOP);
    13.     hbmDib = CreateDIBSection(hdcScreen, &bmiDib, DIB_PAL_COLORS, (LPVOID *)&lpDib, NULL, 0);
    14.     ReleaseDC(HWND_DESKTOP, hdcScreen);
    15.    
    16.     return hbmDib;
    17. }
    18.  
    19. BOOL TakeScreenshot(CHAR * filename){
    20.      RECT rcDim = {
    21.           0, 0, GetSystemMetrics(SM_CXSCREEN), GetSystemMetrics(SM_CYSCREEN)
    22.      };
    23.      
    24.      HANDLE hFile;
    25.      DWORD dwOut;
    26.      HBITMAP hbmBitmap;
    27.      HDC hdcScreen, hdcBitmap;
    28.      int nCapture, nHeaders, nImageSize;
    29.      
    30.      hbmBitmap = CreateDib(rcDim.right, rcDim.bottom, 24);
    31.      hdcScreen = GetDC(HWND_DESKTOP);
    32.      hdcBitmap = CreateCompatibleDC(hdcScreen);
    33.      ReleaseDC(HWND_DESKTOP, hdcScreen);
    34.      
    35.      nCapture = SaveDC(hdcBitmap);
    36.      SelectObject(hdcBitmap, hbmBitmap);
    37.      
    38.      hdcScreen = GetDC(NULL);
    39.    
    40.      BitBlt(hdcBitmap,0,0,rcDim.right,rcDim.bottom,hdcScreen,0,0,SRCCOPY);
    41.    
    42.      RestoreDC(hdcBitmap, nCapture);
    43.      DeleteDC(hdcBitmap);
    44.    
    45.      BITMAP bm; GetObject(hbmBitmap, sizeof(BITMAP), &bm);
    46.      nHeaders = sizeof(BITMAPINFOHEADER) + sizeof(BITMAPFILEHEADER);
    47.      nImageSize = (bm.bmWidthBytes * bm.bmHeight);
    48.    
    49.      BITMAPFILEHEADER bmFile = {'MB', nHeaders + nImageSize, 0, 0, nHeaders};
    50.    
    51.      BITMAPINFOHEADER bmInfo = {\
    52.                       sizeof(bmInfo), bm.bmWidth, bm.bmHeight, bm.bmPlanes,\
    53.                       bm.bmBitsPixel, BI_RGB, nImageSize, 0, 0, 0, 0\
    54.      };
    55.    
    56.      if((hFile = CreateFile(\
    57.                filename,FILE_WRITE_DATA,FILE_SHARE_WRITE,NULL,\
    58.                CREATE_ALWAYS,FILE_ATTRIBUTE_NORMAL,NULL\
    59.      )) != INVALID_HANDLE_VALUE){
    60.            WriteFile(hFile,&bmFile, sizeof(bmFile), &dwOut, NULL);
    61.            WriteFile(hFile,&bmInfo, sizeof(bmInfo), &dwOut, NULL);
    62.            WriteFile(hFile,bm.bmBits, nImageSize, &dwOut, NULL);
    63.          
    64.            CloseHandle(hFile);
    65.      }
    66.    
    67.      DeleteObject(hbmBitmap);
    68.    
    69.      return (hFile != INVALID_HANDLE_VALUE);
    70. }
    71.  
    72. int main() {
    73.  
    74.        TakeScreenshot("rez.bmp");
    75.        return 0;
    76. }
    Собирал в Dev-C++

    Как вариант можно сделать либу и подключится под masm
    Или поискать )))
     
  4. l_inc

    l_inc New Member

    Публикаций:
    0
    Регистрация:
    29 сен 2005
    Сообщения:
    2.566
    777user777
    Поиск по форуму
    Учтите, что там в примере сбивается стек из-за того, что GdiplusStartup принимает три параметра, а не два. Баг не проявляется, т.к. ... на самом деле он просто чудом не проявляется.
     
  5. _sheva740

    _sheva740 New Member

    Публикаций:
    0
    Регистрация:
    31 авг 2005
    Сообщения:
    1.539
    Адрес:
    Poland
    l_inc
    А как бы чтобы скрин был на 5M?
    Как бы поджать эту bmp - шку?

    Может zlib-ом?
    Или еще как можно?
     
  6. l_inc

    l_inc New Member

    Публикаций:
    0
    Регистрация:
    29 сен 2005
    Сообщения:
    2.566
    _sheva740
    Замените значение encoderMIME на image/jpeg.
     
  7. Urimat

    Urimat New Member

    Публикаций:
    0
    Регистрация:
    12 авг 2023
    Сообщения:
    1
    Было бы неплохо в main добавить SetProcessDPIAware(), иначе при dpi != 100% будет неполное изображение