C ++截取屏幕截图

时间:2017-05-31 13:27:34

标签: c++ winapi gdi

我是C ++的新手,必须截取屏幕截图。我认为我已经设置了除打印方法本身以外的所有内容,而这正是我在努力的地方。

我发现了一篇关于如何截取屏幕截图的帖子,但它对我来说不起作用。 (How to capture part of the screen and save it to a BMP?

我的方法如下:

STDOVERRIDEMETHODIMP VImplPrintable::Print(HDC hdc, CRect* pCr)
{  
  HDC hdcSource = GetDC(NULL);
  HDC hdcMemory = CreateCompatibleDC(hdcSource);   

  int capX = GetDeviceCaps(hdcSource, HORZRES);
  int capY = GetDeviceCaps(hdcSource, VERTRES);

  HBITMAP hBitmap = CreateCompatibleBitmap(hdcSource, pCr->Width(), pCr->Height());
  HBITMAP hBitmapOld = (HBITMAP)SelectObject(hdcMemory, hBitmap);

  BitBlt(hdcMemory, 0, 0, pCr->Width(), pCr->Height(), hdcSource, pCr->top, pCr->left, SRCCOPY);

  DeleteDC(hdcSource);
  DeleteDC(hdcMemory);

  return S_OK;
}

问题是截图似乎是一个空位图。 我真的不知道当我创建一个新的HDC时是否有意义 已经将一个作为参数。任何帮助表示赞赏。

1 个答案:

答案 0 :(得分:1)

我无法测试,因为我不知道调用该方法的框架是什么,但是当您收到要写入的HDC时,您根本不应该使用内存DC并直接使用BitBlt。但是您还应该测试WinAPI调用的返回值,以便将错误条件返回给调用者:

STDOVERRIDEMETHODIMP VImplPrintable::Print(HDC hdc, CRect* pCr)
{  
  HDC hdcSource = GetDC(NULL);
  if (NULL == hdcSource) return E_FAIL;

  HRESUL cr = S_OK;

  if (!BitBlt(hdc, 0, 0, pCr->Width(), pCr->Height(), hdcSource, pCr->top, pCr->left, 
      SRCCOPY)) cr = E_FAIL;

  DeleteDC(hdcSource);

  return cr;
}