gpt4 book ai didi

c++ - 来自程序子窗口的位图返回为黑色

转载 作者:可可西里 更新时间:2023-11-01 09:32:25 24 4
gpt4 key购买 nike

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

但是问题来了。


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

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

但这就是我想要的:Image


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

我首先尝试沿着窗口层次结构向下移动并获取子窗口的位图,但我得到的是黑色位图,如下所示:Black 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


提前致谢


编辑我当前用来获取位图的窗口是程序父窗口 "NoxPlayer" .使用任何子窗口时,我都会遇到黑色位图问题。

最佳答案

找到正确的窗口,例如,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 感知的,以便它获得正确的坐标。

关于c++ - 来自程序子窗口的位图返回为黑色,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48854815/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com