来自程序子 window returns 的位图为黑色

Bitmap from program child window returns as black

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

但是问题来了


程序在我看来是这样的: NoxPlayer

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

但这就是我想要的:Image


我可以简单地剪切位图的顶部,但我想尝试做的是在不剪切位图的情况下获取 window 的内部部分 Image。 =22=]

我首先尝试进入 window 层次结构并获取子 windows 的位图,但我得到的是黑色位图,如下所示:Black window

Window 从 Microsoft Spy++ 看到的层次结构:Hierarchy

我用红色标记的那些是我试图从中获取位图的那些,因为 ScreenBoardClassWindow 及其所有子级在通过突出显示检查它们的位置时都属于这个 Box在 Microsoft Spy++


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

  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


提前致谢


编辑 我目前用来获取位图的 window 是 Program Parent window "NoxPlayer"。使用任何子项时 windows 我遇到黑色位图问题。

找到正确的 window,例如,QWidgetClassWindow 然后使用 GetWindowRect 找到相对于桌面 window 的坐标。使用 BitBlt 而不是 PrintWindow

在此示例中,目标应用程序必须在屏幕上可见。不应被其他windows.

遮挡
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 感知的,以便它获得正确的坐标。