程序子窗口中的位图返回黑色

时间:2018-02-18 17:53:13

标签: c++ windows winapi bitmap hwnd

现状: 我有一个名为" NoxPlayer"这基本上是一个Android模拟器。 我还有一个c ++程序,它定位所述NoxPlayer的窗口句柄,并创建窗口当前状态的位图并将其保存到剪贴板。

但问题来了。

这就是程序对我的看法: NoxPlayer

这就是它在剪贴板中保存的内容:Clipboard

但这就是我想要的:Image

我可以简单地剪切位图的顶部但我希望尝试做的是获取窗口的内部部分,如Image所示,而不切割位图。

我首先尝试沿着窗口层次结构获取子窗口的位图,但我得到的是黑色位图,如下所示:Black window

从Microsoft Spy ++中看到的窗口层次结构:Hierarchy

我用红色标记的那些是我试图从中获取位图的那些,因为ScreenBoardClassWindow及其所有子项在通过在Microsoft Spy ++中突出显示它们来检查它们的位置时会落入此Box

这是我用来创建位图并将其保存到剪贴板的代码:

  RECT rc;
  GetClientRect(NoxHandle, &rc);

  //create
  HDC hdcScreen = GetDC(NULL);
  HDC hdc = CreateCompatibleDC(hdcScreen);
  HBITMAP hbmp = CreateCompatibleBitmap(hdcScreen,rc.right - rc.left, rc.bottom - rc.top);
  SelectObject(hdc, hbmp);

  //Print to memory hdc
  PrintWindow(NoxHandle, hdc, PW_CLIENTONLY);

  //copy to clipboard
  OpenClipboard(NULL);
  EmptyClipboard();
  SetClipboardData(CF_BITMAP, hbmp);
  CloseClipboard();

  //release
  DeleteDC(hdc);
  DeleteObject(hbmp);
  ReleaseDC(NULL, hdcScreen);

代码来自此处:Link

提前致谢

修改的 我用来当前获取位图的窗口是Program Parent窗口"NoxPlayer"。当使用任何子窗口时,我得到黑色位图问题。

1 个答案:

答案 0 :(得分:1)

找到正确的窗口,例如QWidgetClassWindow,然后使用GetWindowRect查找与桌面窗口相关的坐标。使用BitBlt代替PrintWindow

使用此示例,目标应用程序必须在屏幕上可见。它不应该受到其他窗户的阻碍。

RECT rc;
HWND hwnd = h_QWidgetClassWindow;
GetWindowRect(hwnd, &rc);
int w = rc.right - rc.left;
int h = rc.bottom - rc.top;

Sleep(3000);
//create
HDC hdc = GetDC(0);
HDC memdc = CreateCompatibleDC(hdc);
HBITMAP hbmp = CreateCompatibleBitmap(hdc, w, h);
HBITMAP oldbmp = (HBITMAP)SelectObject(memdc, hbmp);

BitBlt(memdc, 0, 0, w, h, hdc, rc.left, rc.top, SRCCOPY);
SelectObject(memdc, oldbmp);

//copy to clipboard
OpenClipboard(NULL);
EmptyClipboard();
SetClipboardData(CF_BITMAP, hbmp);
CloseClipboard();

//release
DeleteDC(memdc);
DeleteObject(hbmp);
ReleaseDC(0, hdc);

还要确保您的应用程序能够识别DPI,以便获得正确的坐标。