求助!!用c++ 获取当前屏幕的图像

nwnw5921 2011-07-04 07:44:57
求助!求助!SOS! 我想用c++实现获取当前的屏幕图像,并且显示出来! 怎么写啊,没有一点头绪,请高手、大侠们指点指点小弟啊~ 在此先谢过了!!
...全文
963 13 打赏 收藏 转发到动态 举报
写回复
用AI写文章
13 条回复
切换为时间正序
请发表友善的回复…
发表回复
灼眼的超哥 2011-12-28
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 pathuang68 的回复:]

办法有很多,你还可以用DirectX截取屏幕上的视频 + 音频。
[/Quote]
屏幕上有音频?
wskuge 2011-12-28
  • 打赏
  • 举报
回复
MFC包装的东西太多了,感觉用起来好累赘。
老猿的春天 2011-07-09
  • 打赏
  • 举报
回复
给你个思路,自己做,抓屏程序,先把屏幕DC拷贝到内存,这个内存,你可以用来保存为图片文件,你也可以把内存绘制到屏幕
就想叫yoko 2011-07-07
  • 打赏
  • 举报
回复
MFC QT都行
CSDN下载频道都有
koolxiaoyuer 2011-07-07
  • 打赏
  • 举报
回复
Mark下,有时间研究下 L5 & L7
GARY 2011-07-05
  • 打赏
  • 举报
回复
楼主是要截屏吧。
如果是windows系统,就是“绘图”的反过程
将HDC保存为图像文件(如bmp)

// 获取HDC的数据
BOOL GetHDCData(HDC hdc,const RECT &rcDC,std::vector<BYTE> &vtBuf)
{
BOOL bRes = FALSE;
HBITMAP hBmp = NULL;
HDC hdcMem = NULL;

__try
{
//Initilaize the bitmap information
BITMAPINFO bmpInfo = {0};
bmpInfo.bmiHeader.biSize = sizeof(BITMAPINFOHEADER);
bmpInfo.bmiHeader.biWidth = rcDC.right - rcDC.left;
bmpInfo.bmiHeader.biHeight = rcDC.bottom - rcDC.top;
bmpInfo.bmiHeader.biPlanes = 1;
bmpInfo.bmiHeader.biBitCount = 24;

//Create the compatible DC to get the data
hdcMem = CreateCompatibleDC(hdc);
if(hdcMem == NULL)
{
//ASSERT(FALSE);
//RETAILMSG(TRUE,(TEXT("CreateCompatibleDC failed! Error Code:0x%x\r\n"),GetLastError()));
__leave;
}

//Get the data from the memory DC
BYTE *pData = NULL;
hBmp = CreateDIBSection(hdcMem,&bmpInfo,DIB_RGB_COLORS,reinterpret_cast<VOID **>(&pData),NULL,0);
if(hBmp == NULL)
{
//ASSERT(FALSE);
//RETAILMSG(TRUE,(TEXT("CreateDIBSection failed! Error Code:0x%x\r\n"),GetLastError()));
__leave;
}
HGDIOBJ hOldObj = SelectObject(hdcMem, hBmp);

//Draw to the memory DC
SIZE sizeImg = {bmpInfo.bmiHeader.biWidth,bmpInfo.bmiHeader.biHeight};
SIZE sizeDC = {rcDC.right - rcDC.left,rcDC.bottom - rcDC.top};
StretchBlt(hdcMem,
0,
0,
sizeImg.cx,
sizeImg.cy,
hdc,
rcDC.left,
rcDC.top,
sizeDC.cx,
sizeDC.cy,
SRCCOPY);


vtBuf.resize(sizeImg.cx * sizeImg.cy * 3);
memcpy(&vtBuf[0],pData,vtBuf.size());

SelectObject(hdcMem, hOldObj);

bRes = TRUE;

}
__finally
{

if(hBmp != NULL)
{
DeleteObject(hBmp);
}

if(hdcMem != NULL)
{
DeleteDC(hdcMem);
}
}

return bRes;
}

// 保存HDC为BMP文件
BOOL WriteBmp(const TSTRING &strFile,HDC hdc,const RECT &rcDC)
{
std::vector<BYTE> vtData;
if(GetHDCData(hdc,rcDC,vtData) == FALSE)
{
return FALSE;
}

SIZE sizeImg = {rcDC.right - rcDC.left,rcDC.bottom - rcDC.top};

BITMAPINFOHEADER bmInfoHeader = {0};
bmInfoHeader.biSize = sizeof(BITMAPINFOHEADER);
bmInfoHeader.biWidth = sizeImg.cx;
bmInfoHeader.biHeight = sizeImg.cy;
bmInfoHeader.biPlanes = 1;
bmInfoHeader.biBitCount = 24;

//Bimap file header in order to write bmp file
BITMAPFILEHEADER bmFileHeader = {0};
bmFileHeader.bfType = 0x4d42; //bmp
bmFileHeader.bfOffBits = sizeof(BITMAPFILEHEADER) + sizeof(BITMAPINFOHEADER);
bmFileHeader.bfSize = bmFileHeader.bfOffBits + ((bmInfoHeader.biWidth * bmInfoHeader.biHeight) * 3); ///3=(24 / 8)

HANDLE hFile = CreateFile(strFile.c_str(),GENERIC_WRITE,0,NULL,CREATE_ALWAYS,FILE_ATTRIBUTE_NORMAL,NULL);
if(hFile == INVALID_HANDLE_VALUE)
{
return FALSE;
}

DWORD dwWrite = 0;
WriteFile(hFile,&bmFileHeader,sizeof(BITMAPFILEHEADER),&dwWrite,NULL);
WriteFile(hFile,&bmInfoHeader, sizeof(BITMAPINFOHEADER),&dwWrite,NULL);
WriteFile(hFile,&vtData[0], vtData.size(),&dwWrite,NULL);


CloseHandle(hFile);

return TRUE;
}

// 截屏
HDC hdc = CreateDC(_T("DISPLAY"), NULL, NULL, NULL);
RECT rcSave = {0,0,GetDeviceCaps(hdc,HORZRES),GetDeviceCaps(hdc,VERTRES)};
WriteBmp(TEXT("D:\\Temp\\ScreenCapture.BMP"),hdc,rcSave);
DeleteDC(hdc);
pathuang68 2011-07-05
  • 打赏
  • 举报
回复
办法有很多,你还可以用DirectX截取屏幕上的视频 + 音频。
lt114896 2011-07-05
  • 打赏
  • 举报
回复

HBITMAP CopyScreenToBitmap(int &nWidth, int &nHeight)
{
//屏幕和内存设备描述表
HDC hScrDC, hMemDC;
//位图句柄
HBITMAP hBitmap,hOldBitmap;
//屏幕分辨率
int xScrn,yScrn;
//为屏幕创建设备描述表
hScrDC = CreateDC("DISPLAY", NULL, NULL, NULL);
//为屏幕设备描述表创建兼容的内存设备描述表
hMemDC = CreateCompatibleDC(hScrDC);
//获得屏幕分辨率
xScrn = GetDeviceCaps(hScrDC, HORZRES);
yScrn = GetDeviceCaps(hScrDC, VERTRES);

//存储屏幕的宽度
nWidth = xScrn;
nHeight = yScrn;

//创建一个与屏幕设备描述表兼容的 位图
hBitmap = CreateCompatibleBitmap(hScrDC, xScrn,yScrn);
//把新位图选到内存设备描述表中
hOldBitmap = (HBITMAP)SelectObject(hMemDC, hBitmap);
//把屏幕设备描述表拷贝到内存设备描述表中
BitBlt(hMemDC, 0, 0, xScrn, yScrn, hScrDC, 0, 0, SRCCOPY);
//得到屏幕位图句柄
hBitmap = (HBITMAP)SelectObject(hMemDC, hOldBitmap);
//清除
DeleteDC(hScrDC);
DeleteDC(hMemDC);

//返回位图句柄
return hBitmap;
}
void CJiepingDlg::OnButDisp()
{
// TODO: Add your control notification handler code here
HBITMAP bmp;
int nWidth,nHeight;
//zhuapingg
bmp = CopyScreenToBitmap(nWidth, nHeight);
//将抓取的屏幕压缩先是到窗体上
CDC *pDC = new CClientDC(this);
CDC srcDC;
CRect rect;
this->GetClientRect(&rect);
// GetClientRect(&rect);
rect.DeflateRect(0,20);
//绘制显示区域矩形
CPen pen;
pen.CreatePen(PS_SOLID, 2, RGB(0,255,255));
pDC->SelectObject(&pen);
pDC->Rectangle(rect);
//、显示屏幕
srcDC.CreateCompatibleDC(pDC);
srcDC.SelectObject(bmp);

//压缩显示抓取的位图
pDC->StretchBlt(rect.left+2,rect.top+2,rect.right-rect.left-4,rect.bottom-rect.top-4,&srcDC,0,0,nWidth,nHeight,SRCCOPY);
pen.DeleteObject();
DeleteObject(bmp);
srcDC.DeleteDC();
delete pDC;
}
nwnw5921 2011-07-05
  • 打赏
  • 举报
回复
用MFC啊~ 俺是新手,还有什么系统啊? 3楼的函数,我先试试去~ 都谢谢了啊~
afreet2006 2011-07-05
  • 打赏
  • 举报
回复
7楼能够实现, 不过保存路径得事先创建好
alweeq86 2011-07-04
  • 打赏
  • 举报
回复
HWND currentHwnd=::FindWindow(NULL,L"Microsoft Visual Studio");
HDC currentDc=::GetDC(currentHwnd);
HDC dialogDc=::GetWindowDC(m_hWnd);
::BitBlt(dialogDc,0,0,200,200,currentDc,0,0,SRCCOPY);
科技完美生活 2011-07-04
  • 打赏
  • 举报
回复
你是什么系统啊,不同系统方法不一样啊
碎炎 2011-07-04
  • 打赏
  • 举报
回复
这个要调api的吧

64,654

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧