如何截取某一窗口内的图像 VC

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了如何截取某一窗口内的图像 VC相关的知识,希望对你有一定的参考价值。

如何截取某一窗口内的图像,类似游戏中截图,按下键盘中按键,只截取该程序窗口内的图象。

参考技术A 取得client句柄->取得其DC->用CDC的函数将该DC的内容blt到bmp中。
总之取得窗口的CDC是肯定要的,能成功取得了以后你可以用CDC的函数按照你的需要来做
参考技术B 这个很简单呀,只要你了解位图的结构,然后把屏幕的区域象素保存到位图里就可以啦。 参考技术C 你用原生的api BOOL GetClientRect( HWND hWnd,LPRECT lpRect); 不用MFC的试试看呢?用 GetForegroundWindow 获取前端窗口句柄 参考技术D void GetWindowClientImg(HWND hwnd, HDC hdc)

RECT rect;
GetClientRect(hwnd, &rect);
HDC whdc = GetDC(hwnd);
BitBlt(hdc, 0, 0, rect.right, rect.bottom, whdc, 0, 0, SRCCOPY);
ReleaseDC(hwnd, whdc);
本回答被提问者采纳

VC++截图编程:如何能完整地截图?要求是能够截取层级窗口的方法。

现在流行一种用全局DC的截图方法:

CDC *pDc=this->GetDC();
hscreendc=::GetDC(0);
hmemdc=CreateCompatibleDC(hscreendc);
hbitmap=CreateCompatibleBitmap(hscreendc,BMCX,BMCY);
SelectObject(hmemdc,hbitmap);
BitBlt(hmemdc,0,0,BMCX,BMCY,hscreendc,0,0,SRCCOPY);//将屏幕内容保存至内存DC
::ReleaseDC(NULL,hscreendc); hscreendc=NULL;
dwRtn= GetBitmapBits(hbitmap,dwOriginBufLen,(LPVOID)pBufOrigin);//将图像的像素信息读取进内存

这种用全局DC方法固然能截图,但是对于层级窗体(调用过 SetLayeredWindowAttributes 的窗体,窗体能具有半透明效果)却不起作用,而PrintScreen 键则可以截取到层级窗体。说明全局DC截图法与 printScreen 键的截图功能是不同的,现在想问问怎样才能做到类似PrintScreen 键的截图功能,即最正规的截图方法。
注意:不能模拟按printScreen键改动剪贴板。
完全解决疑问可追加30分!

参考技术A BitBlt 的最后一个参数,通常我们用SRCCOPY,对吧?
改成 SRCCOPY | CAPTUREBLT
原因和细节请参看MSDN

以上是关于如何截取某一窗口内的图像 VC的主要内容,如果未能解决你的问题,请参考以下文章

如何从视频中提取某一帧的图像

opencv截取图像中某一区域的方法

满意可以继续加分,MFC怎么截取指定区域的图像

如何截取matlab绘制的图像

VC++ win32 API 编程:如何将图像从剪贴板中取出并显示在窗口中?

用VC++如何获取屏幕图像,且显示出来