现状: 我有一个名为" 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"。当使用任何子窗口时,我得到黑色位图问题。
答案 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,以便获得正确的坐标。