来自程序子 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 感知的,以便它获得正确的坐标。
现状: 我有一个名为 "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 感知的,以便它获得正确的坐标。