C++實現螢幕截圖功能
阿新 • • 發佈:2020-12-15
技術標籤:C++
本文例項為大家分享了C++實現全屏截圖功能的具體程式碼,供大家參考,具體內容如下
最近維護的專案,在某些情況下,光有日誌還不行,於是添加了截圖功能,特定情況下,會自動截圖,輔助分析,從而改程序序。以下是截圖實現程式碼。
void CDemoDlg::ScreenShot(void)
{
CWnd *pDesktop = GetDesktopWindow();
CDC *pdeskdc = pDesktop->GetDC();
CRect re;
//獲取視窗的大小
pDesktop->GetClientRect(&re);
CBitmap bmp;
bmp.CreateCompatibleBitmap(pdeskdc, re.Width(), re.Height());
//建立一個相容的記憶體畫板
CDC memorydc;
memorydc.CreateCompatibleDC(pdeskdc);
//選中畫筆
CBitmap *pold = memorydc.SelectObject(&bmp);
//繪製圖像
memorydc.BitBlt(0, 0, re.Width(), re.Height(), pdeskdc, 0, 0, SRCCOPY);
//獲取滑鼠位置,然後新增滑鼠影象
CPoint po;
GetCursorPos(&po);
HICON hinco = (HICON)GetCursor();
memorydc.DrawIcon(po.x - 10, po.y - 10, hinco);
//選中原來的畫筆
memorydc.SelectObject(pold);
BITMAP bit;
bmp.GetBitmap(&bit);
//定義 影象大小(單位:byte)
DWORD size = bit.bmWidthBytes * bit.bmHeight;
LPSTR lpdata = (LPSTR)GlobalAlloc(GPTR, size);
//後面是建立一個bmp檔案的必須檔案頭
BITMAPINFOHEADER pbitinfo;
pbitinfo.biBitCount = 24;
pbitinfo.biClrImportant = 0;
pbitinfo.biCompression = BI_RGB;
pbitinfo.biHeight = bit.bmHeight;
pbitinfo.biPlanes = 1;
pbitinfo.biSize = sizeof(BITMAPINFOHEADER);
pbitinfo.biSizeImage = size;
pbitinfo.biWidth = bit.bmWidth;
pbitinfo.biXPelsPerMeter = 0;
pbitinfo.biYPelsPerMeter = 0;
GetDIBits(pdeskdc->m_hDC, bmp, 0, pbitinfo.biHeight, lpdata, (BITMAPINFO*)
&pbitinfo, DIB_RGB_COLORS);
BITMAPFILEHEADER bfh;
bfh.bfReserved1 = bfh.bfReserved2 = 0;
bfh.bfType = ((WORD)('M' << 8) | 'B');
bfh.bfSize = size + 54;
bfh.bfOffBits = 54;
//寫入檔案
CFile file;
CString strFileName(GetAppPathW().c_str());
strFileName += _T("ScreenShot\\");
CreateDirectory((LPCTSTR)strFileName, NULL);
CTime t = CTime::GetCurrentTime();
CString tt = t.Format("%Y-%m-%d_%H-%M-%S");
strFileName += tt;
strFileName += _T(".bmp");
if (file.Open((LPCTSTR)strFileName, CFile::modeCreate | CFile::modeWrite))
{
file.Write(&bfh, sizeof(BITMAPFILEHEADER));
file.Write(&pbitinfo, sizeof(BITMAPINFOHEADER));
file.Write(lpdata, size);
file.Close();
}
GlobalFree(lpdata);
}
程式碼註釋詳盡,我就不多說啥了,儲存為bmp無損檔案,體積會有些大,朋友可以轉化為png格式儲存哦。
以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支援指令碼之家。