windows API 實現截圖

來源:互聯網
上載者:User

標籤:

參考:http://bbs.csdn.net/topics/330154355

#include "stdio.h"#include "windows.h"/************************************************************************//* hBitmap    為剛才的螢幕位元影像控制代碼                                                                   /* lpFileName 為須要儲存的位元影像檔案名稱/************************************************************************/int SaveBitmapToFile(HBITMAP hBitmap,LPSTR lpFileName) {             HDC            hDC; //裝置描寫敘述表    int            iBits;//當前顯示解析度下每一個像素所佔位元組數    WORD           wBitCount;//位元影像中每一個像素所佔位元組數        DWORD          dwPaletteSize=0;//定義調色盤大小    DWORD          dwBmBitsSize;//位元影像中像素位元組大小    DWORD          dwDIBSize;// 位元影像檔案大小    DWORD          dwWritten;//寫入檔案位元組數    BITMAP         Bitmap;//位元影像結構    BITMAPFILEHEADER   bmfHdr;   //位元影像屬性結構       BITMAPINFOHEADER   bi;       //位元影像檔案頭結構    LPBITMAPINFOHEADER lpbi;     //位元影像資訊頭結構     指向位元影像資訊頭結構    HANDLE          fh;//定義檔案控制代碼    HANDLE            hDib;//分配記憶體控制代碼    HANDLE            hPal;//分配記憶體控制代碼    HANDLE          hOldPal=NULL;//調色盤控制代碼           //計算位元影像檔案每一個像素所佔位元組數       hDC = CreateDC("DISPLAY",NULL,NULL,NULL);       iBits = GetDeviceCaps(hDC, BITSPIXEL) * GetDeviceCaps(hDC, PLANES);       DeleteDC(hDC);         if (iBits <= 1)               wBitCount = 1;       else if (iBits <= 4)               wBitCount = 4;       else if (iBits <= 8)               wBitCount = 8;       else if (iBits <= 24)        wBitCount = 24;    else if (iBits<=32)        wBitCount = 24;              //計算調色盤大小       if (wBitCount <= 8)               dwPaletteSize = (1 << wBitCount) *sizeof(RGBQUAD);                   //設定位元影像資訊頭結構       GetObject(hBitmap, sizeof(BITMAP), (LPSTR)&Bitmap);       bi.biSize            = sizeof(BITMAPINFOHEADER);       bi.biWidth           = Bitmap.bmWidth;       bi.biHeight          = Bitmap.bmHeight;       bi.biPlanes          = 1;       bi.biBitCount         = wBitCount;           bi.biCompression      = BI_RGB;       bi.biSizeImage        = 0;       bi.biXPelsPerMeter     = 0;       bi.biYPelsPerMeter     = 0;       bi.biClrUsed         = 0;       bi.biClrImportant      = 0;       dwBmBitsSize = ((Bitmap.bmWidth *wBitCount+31)/32)* 4*Bitmap.bmHeight ;         //為位元影像內容分配記憶體       hDib  = GlobalAlloc(GHND,dwBmBitsSize+dwPaletteSize+sizeof(BITMAPINFOHEADER));       lpbi = (LPBITMAPINFOHEADER)GlobalLock(hDib);    if (lpbi==NULL)    {        return 0;    }         *lpbi = bi;       // 處理調色盤    hPal = GetStockObject(DEFAULT_PALETTE);       if (hPal)    {               hDC  = GetDC(NULL);               hOldPal = ::SelectPalette(hDC, (HPALETTE)hPal, FALSE);               RealizePalette(hDC);           }       // 擷取該調色盤下新的像素值       GetDIBits(hDC, hBitmap, 0, (UINT) Bitmap.bmHeight,               (LPSTR)lpbi + sizeof(BITMAPINFOHEADER)+dwPaletteSize,        (LPBITMAPINFO)lpbi, DIB_RGB_COLORS);       //恢複調色盤          if (hOldPal)           {               SelectPalette(hDC, (HPALETTE)hOldPal, TRUE);               RealizePalette(hDC);               ReleaseDC(NULL, hDC);           }       //建立位元影像檔案           fh = CreateFile(lpFileName, GENERIC_WRITE,                0, NULL, CREATE_ALWAYS,               FILE_ATTRIBUTE_NORMAL | FILE_FLAG_SEQUENTIAL_SCAN, NULL);        if (fh == INVALID_HANDLE_VALUE)               return FALSE;         // 設定位元影像檔案頭       bmfHdr.bfType = 0x4D42;  // "BM"       dwDIBSize    = sizeof(BITMAPFILEHEADER) + sizeof(BITMAPINFOHEADER)+ dwPaletteSize + dwBmBitsSize;         bmfHdr.bfSize = dwDIBSize;       bmfHdr.bfReserved1 = 0;       bmfHdr.bfReserved2 = 0;       bmfHdr.bfOffBits = (DWORD)sizeof(BITMAPFILEHEADER) + (DWORD)sizeof(BITMAPINFOHEADER)+ dwPaletteSize;         // 寫入位元影像檔案頭       WriteFile(fh, (LPSTR)&bmfHdr, sizeof(BITMAPFILEHEADER), &dwWritten, NULL);         // 寫入位元影像檔案其餘內容       WriteFile(fh, (LPSTR)lpbi, dwDIBSize, &dwWritten, NULL);         //清除          GlobalUnlock(hDib);       GlobalFree(hDib);       CloseHandle(fh);         return 1;} HBITMAP   GetCaptureBmp()   {    HDC     hDC;       HDC     MemDC;       BYTE*   Data;       HBITMAP   hBmp;       BITMAPINFO   bi;            memset(&bi,   0,   sizeof(bi));       bi.bmiHeader.biSize   =   sizeof(BITMAPINFO);    bi.bmiHeader.biWidth   =  GetSystemMetrics(SM_CXSCREEN);       bi.bmiHeader.biHeight   = GetSystemMetrics(SM_CYSCREEN);       bi.bmiHeader.biPlanes   =   1;       bi.bmiHeader.biBitCount   =   24;            hDC   =   GetDC(NULL);       MemDC   =   CreateCompatibleDC(hDC);       hBmp   =   CreateDIBSection(MemDC,   &bi, DIB_RGB_COLORS,   (void**)&Data,   NULL,   0);       SelectObject(MemDC,   hBmp);       BitBlt(MemDC,   0,   0,   bi.bmiHeader.biWidth,   bi.bmiHeader.biHeight,hDC,   0,   0,   SRCCOPY);       ReleaseDC(NULL,   hDC);         DeleteDC(MemDC);       return   hBmp;   }     void main(){    HBITMAP   hBmp;        hBmp   =   GetCaptureBmp();     SaveBitmapToFile(hBmp,"c:\\11.bmp");   }


windows API 實現

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.