windows API 实现截图
生活随笔
收集整理的這篇文章主要介紹了
windows API 实现截图
小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
參考:http://bbs.csdn.net/topics/330154355
#include "stdio.h" #include "windows.h" /************************************************************************/ /* hBitmap 為剛才的屏幕位圖句柄 /* lpFileName 為須要保存的位圖文件名稱 /************************************************************************/ int SaveBitmapToFile(HBITMAP hBitmap,LPSTR lpFileName) { HDC hDC; //設(shè)備描寫(xiě)敘述表int iBits;//當(dāng)前顯示分辨率下每一個(gè)像素所占字節(jié)數(shù)WORD wBitCount;//位圖中每一個(gè)像素所占字節(jié)數(shù) DWORD dwPaletteSize=0;//定義調(diào)色板大小DWORD dwBmBitsSize;//位圖中像素字節(jié)大小DWORD dwDIBSize;// 位圖文件大小DWORD dwWritten;//寫(xiě)入文件字節(jié)數(shù)BITMAP Bitmap;//位圖結(jié)構(gòu)BITMAPFILEHEADER bmfHdr; //位圖屬性結(jié)構(gòu) BITMAPINFOHEADER bi; //位圖文件頭結(jié)構(gòu)LPBITMAPINFOHEADER lpbi; //位圖信息頭結(jié)構(gòu) 指向位圖信息頭結(jié)構(gòu)HANDLE fh;//定義文件句柄HANDLE hDib;//分配內(nèi)存句柄HANDLE hPal;//分配內(nèi)存句柄HANDLE hOldPal=NULL;//調(diào)色板句柄 //計(jì)算位圖文件每一個(gè)像素所占字節(jié)數(shù) 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;//計(jì)算調(diào)色板大小 if (wBitCount <= 8) dwPaletteSize = (1 << wBitCount) *sizeof(RGBQUAD);//設(shè)置位圖信息頭結(jié)構(gòu) 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 ;//為位圖內(nèi)容分配內(nèi)存 hDib = GlobalAlloc(GHND,dwBmBitsSize+dwPaletteSize+sizeof(BITMAPINFOHEADER)); lpbi = (LPBITMAPINFOHEADER)GlobalLock(hDib);if (lpbi==NULL){return 0;}*lpbi = bi; // 處理調(diào)色板hPal = GetStockObject(DEFAULT_PALETTE); if (hPal){ hDC = GetDC(NULL); hOldPal = ::SelectPalette(hDC, (HPALETTE)hPal, FALSE); RealizePalette(hDC); } // 獲取該調(diào)色板下新的像素值 GetDIBits(hDC, hBitmap, 0, (UINT) Bitmap.bmHeight, (LPSTR)lpbi + sizeof(BITMAPINFOHEADER)+dwPaletteSize,(LPBITMAPINFO)lpbi, DIB_RGB_COLORS); //恢復(fù)調(diào)色板 if (hOldPal) { SelectPalette(hDC, (HPALETTE)hOldPal, TRUE); RealizePalette(hDC); ReleaseDC(NULL, hDC); } //創(chuàng)建位圖文件 fh = CreateFile(lpFileName, GENERIC_WRITE, 0, NULL, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL | FILE_FLAG_SEQUENTIAL_SCAN, NULL); if (fh == INVALID_HANDLE_VALUE) return FALSE;// 設(shè)置位圖文件頭 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;// 寫(xiě)入位圖文件頭 WriteFile(fh, (LPSTR)&bmfHdr, sizeof(BITMAPFILEHEADER), &dwWritten, NULL);// 寫(xiě)入位圖文件其余內(nèi)容 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"); }總結(jié)
以上是生活随笔為你收集整理的windows API 实现截图的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: mysql在没有任何用户的情况下,如何恢
- 下一篇: 最全IDEA快捷键