?? capturescreen.cpp
字號(hào):
// CaptureScreen.cpp: implementation of the CaptureScreen.
//
//////////////////////////////////////////////////////////////////////
#include "stdafx.h"
#include "CaptureScreen.h"
//////////////////////////////////////////////////////////////////////
LPSTR lpBmpData=NULL;
DWORD dwBmpSize=0;
DWORD dwBmpInfoSize=0;
int CaptureThreadCount=0;
CRITICAL_SECTION csCaptureScreen;
int iBmpCX;
int iBmpCY;
////////////////////////////////////////
//進(jìn)行掃尾工作,釋放內(nèi)存
void CleanScreenInfo(void)
{
if(lpBmpData)
{
GlobalUnlock(lpBmpData);
lpBmpData=(char*)GlobalFree(lpBmpData);
}
dwBmpSize=0;
dwBmpInfoSize=0;
}
//捕捉屏幕數(shù)據(jù)
bool GetScreenData(int nBits)
{
//位圖位數(shù)不能為大于2^24的值,主要考慮到傳輸特性
if (nBits>24)
return false;
HDC hScrDC, hMemDC; // 屏幕和內(nèi)存設(shè)備描述表
HBITMAP hBitmap, hOldBitmap; // 位圖句柄
int xScrn, yScrn; // 屏幕分辨率
HDC hDC; //設(shè)備描述表
WORD wBitCount; //位圖中每個(gè)像素所占字節(jié)數(shù)
//定義調(diào)色板大小, 位圖中像素字節(jié)大小 ,位圖文件大小 , 寫入文件字節(jié)數(shù)
DWORD dwPaletteSize=0, dwBmBitsSize=0;//,dwBmpInfoSize=0;
BITMAP Bitmap; //位圖屬性結(jié)構(gòu)
BITMAPINFOHEADER bi; //位圖信息頭結(jié)構(gòu)
LPBITMAPINFOHEADER lpbi; //指向位圖信息頭結(jié)構(gòu)
//定義文件,分配內(nèi)存句柄,調(diào)色板句柄
HANDLE hDib;
HPALETTE hPal,hOldPal=NULL;
//為屏幕創(chuàng)建設(shè)備描述表
hScrDC = CreateDC("DISPLAY", NULL, NULL, NULL);
// 獲得屏幕分辨率
xScrn = GetDeviceCaps(hScrDC, HORZRES);
yScrn = GetDeviceCaps(hScrDC, VERTRES);
//為屏幕設(shè)備描述表創(chuàng)建兼容的內(nèi)存設(shè)備描述表
hMemDC = CreateCompatibleDC(hScrDC);
// 創(chuàng)建一個(gè)與屏幕設(shè)備描述表兼容的位圖
hBitmap = CreateCompatibleBitmap (hScrDC,xScrn,yScrn);
// 把新位圖選到內(nèi)存設(shè)備描述表中
hOldBitmap = (HBITMAP) SelectObject(hMemDC, hBitmap);
// 把屏幕設(shè)備描述表拷貝到內(nèi)存設(shè)備描述表中
BitBlt(hMemDC, 0, 0, xScrn, yScrn,
hScrDC, 0, 0, SRCCOPY);
//得到屏幕位圖的句柄
hBitmap = (HBITMAP) SelectObject(hMemDC, hOldBitmap);
//計(jì)算位圖每個(gè)像素所占字節(jié)數(shù)
if (nBits <= 1)
wBitCount = 1;
else if (nBits <= 4)
wBitCount = 4;
else if (nBits <= 8)
wBitCount = 8;
else if (nBits <= 16)
wBitCount = 16;
else if (nBits <= 24)
wBitCount = 24;
//計(jì)算調(diào)色板大小
if (wBitCount <24)
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)& ~31)/8 *Bitmap.bmHeight;
dwBmpInfoSize = dwPaletteSize + sizeof(BITMAPINFOHEADER);
//臨時(shí)位圖數(shù)據(jù)大小變量
DWORD dwNewBmpSize;
dwNewBmpSize = dwBmBitsSize + dwBmpInfoSize;
iBmpCX=Bitmap.bmWidth;
iBmpCY=Bitmap.bmHeight;
//為位圖內(nèi)容分配內(nèi)存
if(dwNewBmpSize!=dwBmpSize)//位圖相關(guān)信息沒有變化
{
if(!lpBmpData)
{
hDib = GlobalAlloc(GHND,dwNewBmpSize);
if(!hDib)
{
DeleteObject(hBitmap);
DeleteDC(hScrDC);
DeleteDC(hMemDC);
dwBmpSize=0;
dwBmpInfoSize=0;
return false;
}
}
else
{
GlobalUnlock(lpBmpData);
lpBmpData=(char*)GlobalFree(lpBmpData);
hDib = GlobalAlloc(GHND,dwNewBmpSize);
if(!hDib)
{
DeleteObject(hBitmap);
DeleteDC(hScrDC);
DeleteDC(hMemDC);
dwBmpSize=0;
dwBmpInfoSize=0;
return false;
}
}
lpbi = (LPBITMAPINFOHEADER)GlobalLock(hDib);
*lpbi = bi;
}
else//位圖相關(guān)信息沒有變化
{
lpbi = (LPBITMAPINFOHEADER)lpBmpData;
*lpbi = bi;
}
// 處理調(diào)色板
hPal = (HPALETTE) GetStockObject(DEFAULT_PALETTE);
if (hPal)
{
hDC = GetDC (NULL);
hOldPal = SelectPalette(hDC, hPal, FALSE);
RealizePalette(hDC);
}
// 獲取該調(diào)色板下新的像素值
GetDIBits(
hDC,
hBitmap,
0,
(UINT) Bitmap.bmHeight,
(LPSTR)lpbi + sizeof(BITMAPINFOHEADER) + dwPaletteSize,
(BITMAPINFO *)lpbi,
DIB_RGB_COLORS
);
//恢復(fù)調(diào)色板
if (hOldPal)
{
SelectPalette(hScrDC, hOldPal, TRUE);
RealizePalette(hScrDC);
ReleaseDC(NULL, hDC);
}
lpBmpData = (char *)lpbi;
dwBmpSize = dwNewBmpSize;
//清除
DeleteObject (hBitmap);
DeleteDC(hScrDC);
DeleteDC(hMemDC);
return TRUE;
}
?? 快捷鍵說明
復(fù)制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號(hào)
Ctrl + =
減小字號(hào)
Ctrl + -