返回GDI+的Bitmap的屏幕捕捉方法和问题
我今天写出了返回GDI+的Bitmap的屏幕捕捉方法,供需要者参考。(记得前几天看到有人问这个问题)代码如下:
enum ScreenType
{
FullScreen,
WorkArea,
ActiveWindow
};
Bitmap* CaptureScreen(ScreenType type)
{
HWND wnd;
HDC hDC;
if (type == ActiveWindow) {
wnd = ::GetActiveWindow();
hDC = ::GetWindowDC(wnd);
}
else {
wnd = ::GetDesktopWindow();
hDC = ::GetDC(NULL);
}
ATLASSERT(::IsWindow(wnd));
CRect rect;
if(type==WorkArea )
{
::SystemParametersInfo(SPI_GETWORKAREA,0,&rect,0);
}
else
{
::GetWindowRect(wnd, &rect);
}
HDC hMemDC = ::CreateCompatibleDC(hDC);
//most of the remaining code is normal GDI stuff
HBITMAP hBitmap = ::CreateCompatibleBitmap(hDC, rect.Width(), rect.Height());
if (hBitmap)
{
HBITMAP hOld = (HBITMAP) ::SelectObject(hMemDC, hBitmap);
BitBlt(hMemDC, 0, 0, rect.Width(), rect.Height(), hDC, 0, 0, SRCCOPY);
SelectObject(hMemDC, hOld);
DeleteDC(hMemDC);
ReleaseDC(NULL, hDC);
}
return Bitmap::FromHBITMAP(hBitmap, NULL);
}
这个方法在大多数情况下是有效的。
存在的问题:
如果屏幕上有半透明窗口,在取得Desktop的时候无法取到。半透明窗口就像完全透明了一下。而键盘上的「Print Screen」却可以正确取到。如果你有正确的办法请告知。