关于VC++用API截屏有关问题
关于VC++用API截屏问题
我用VC++(VC6.0和VS)写一个截屏程序。
为什么在有些电脑就能截到当前屏幕显示的所有东西,而有些电脑却截不到全部呢?(例如QQ登录界面啊,工具条啊),截不到不是变黑,而是跟正常一样,只不过哪个窗口没显示出来,而被桌面背景代替。 感到十分奇怪,并不是像别人说的黑屏情况啊,求如何解决?
这是代码:
HDC hDc, memDc;
HWND m_hWnd = ::GetDesktopWindow();
hDc =::GetDC(m_hWnd);
memDc = CreateCompatibleDC(hDc);
int m_screenWidth = GetSystemMetrics(SM_CXSCREEN); //屏幕宽度
int m_screenHeight = GetSystemMetrics(SM_CYSCREEN); //屏幕高度
HBITMAP hBitMap;
hBitMap = CreateCompatibleBitmap(hDc,m_screenWidth,m_screenHeight);
SelectObject(memDc,hBitMap);
BitBlt(memDc,0,0,m_screenWidth,m_screenHeight,hDc,0,0,SRCCOPY);
CImage m_Screen;
m_Screen.Attach(hBitMap);
m_Screen.Save(L"D:\\s.jpg");
------解决思路----------------------
这是我的,用的是GDI+。可以保存成JPEG.或者BMP
------解决思路----------------------
最后一个参数填写SRCCOPY是不能截取到透明窗口的,需要使用组合参数:
我用VC++(VC6.0和VS)写一个截屏程序。
为什么在有些电脑就能截到当前屏幕显示的所有东西,而有些电脑却截不到全部呢?(例如QQ登录界面啊,工具条啊),截不到不是变黑,而是跟正常一样,只不过哪个窗口没显示出来,而被桌面背景代替。 感到十分奇怪,并不是像别人说的黑屏情况啊,求如何解决?
这是代码:
HDC hDc, memDc;
HWND m_hWnd = ::GetDesktopWindow();
hDc =::GetDC(m_hWnd);
memDc = CreateCompatibleDC(hDc);
int m_screenWidth = GetSystemMetrics(SM_CXSCREEN); //屏幕宽度
int m_screenHeight = GetSystemMetrics(SM_CYSCREEN); //屏幕高度
HBITMAP hBitMap;
hBitMap = CreateCompatibleBitmap(hDc,m_screenWidth,m_screenHeight);
SelectObject(memDc,hBitMap);
BitBlt(memDc,0,0,m_screenWidth,m_screenHeight,hDc,0,0,SRCCOPY);
CImage m_Screen;
m_Screen.Attach(hBitMap);
m_Screen.Save(L"D:\\s.jpg");
------解决思路----------------------
CImage mmage;
HWND hWnd = ::GetDesktopWindow();//获得屏幕的HWND.
HDC hScreenDC = ::GetDC(hWnd); //获得屏幕的HDC.
HDC MemDC = ::CreateCompatibleDC(hScreenDC);
RECT rect;
::GetWindowRect(hWnd,&rect);
HBITMAP hBitmap = ::CreateCompatibleBitmap(hScreenDC,rect.right,rect.bottom);
HGDIOBJ hOldBMP = ::SelectObject(MemDC,hBitmap);
::BitBlt(MemDC,0,0,rect.right,rect.bottom,hScreenDC,rect.left,rect.top,SRCCOPY);
hBitmap=(HBITMAP)::SelectObject(MemDC,hOldBMP);
mmage.Attach(hBitmap);
IStream* pStmImage = NULL;
HGLOBAL hMemBmp = GlobalAlloc(GMEM_MOVEABLE,0);//可移动的缓冲区
if (hMemBmp == NULL) return ;
CreateStreamOnHGlobal(hMemBmp, FALSE, &pStmImage);//将内存区B作为流的起始
if (pStmImage == NULL)
{
GlobalFree(hMemBmp);
AfxMessageBox("为空");
return ;
}
//屏幕BMP保存成JPEG IStream流
mmage.Save(pStmImage,Gdiplus::ImageFormatJPEG); //保存成JPEG IStream流
CDC *pDC =this->GetActiveView()->GetDC();//可换成你的DC,这里代码是放在主框架CMainFrame中的,所以才这样写
HDC hDC =pDC ->GetSafeHdc(); // 获取 HDC(设备句柄) 来进行绘图操作
CRect rc;
GetClientRect(&rc);
//mmage.Draw(hDC,rc);///屏幕截图在单文档的界面中显示,这里可以用来验证
//mmage.Save("jjj.jpg");///将图片保存出去,这里可以用来验证
这是我的,用的是GDI+。可以保存成JPEG.或者BMP
------解决思路----------------------
BitBlt(memDc,0,0,m_screenWidth,m_screenHeight,hDc,0,0,SRCCOPY);
最后一个参数填写SRCCOPY是不能截取到透明窗口的,需要使用组合参数:
SRCCOPY
------解决思路----------------------
CAPTUREBLT // CAPTUREBLT - 该参数保证能够截到透明窗口