Current situation: I have a program called "NoxPlayer" which is basically an android emulator. I also have a c++ program which locates the window handle of said NoxPlayer and makes a bitmap of the current state of the window and saves it to the clipboard.
But here comes the problem.
This is how the program looks to me: NoxPlayer
And this is what it saves in the clipboard: Clipboard
But this is what i want: Image
I could have simple cut the top part of the bitmap but what i wish to try and do is get the inner part of the window as seen here Image without cutting the bitmap.
I first tried going down the window hierarchy and getting the bitmap of child windows but what i got was black bitmaps as seen here: Black window
Window hierarchy as seen from Microsoft Spy++: Hierarchy
The ones i marked around with red color are the ones i tried to get a bitmap from, since ScreenBoardClassWindow and all its children fall into this Box when checking their position by highlighting them in Microsoft Spy++
This is the code i used to create a bitmap and save it to the clipboard:
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);
Code is taken from here: Link
Thanks in advance
EDIT The window i use to currently get the bitmap from is the Program Parent window "NoxPlayer". When using any of the children windows I get the black bitmap problem.
Find the right window, example, QWidgetClassWindow then use GetWindowRect to find the coordinates in relation to desktop window. Use BitBlt instead of PrintWindow.
With this example the target application must be visible on the screen. It should not be obstructed by other 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);
Also make sure your application is DPI aware, so that it gets the right coordinates.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With