应用程序Melon的宽度和高度为438 x 615像素,并且:: GetWindowRect()函数可以正确捕获它。
但是,:: PrintWindow()函数绘制的尺寸较小,为348 x 489像素,其余的部分用黑色空白填充(可能什么也不画)
...也许一张照片比数百张照片要好。
这是代码的结果
bool result = true;
HWND appHWnd = ::FindWindow(nullptr, TEXT("Melon"));
RECT appWindowRect; ::GetWindowRect(appHWnd, &appWindowRect);
HDC appDC = ::GetWindowDC(appHWnd);
// HDC appDC = ::GetDC(appHWnd); // same issue occured either
// HDC appDC = ::GetDC(nullptr);
HDC memoryDC = ::CreateCompatibleDC(appDC);
HBITMAP capturedScreenBitmap = ::CreateCompatibleBitmap(
appDC,
appWindowRect.right - appWindowRect.left,
appWindowRect.bottom - appWindowRect.top
);
HBITMAP memoryBitmap = static_cast<HBITMAP>(::SelectObject(memoryDC, capturedScreenBitmap));
result = ::PrintWindow(appHWnd, memoryDC, 0);
//copy to clipboard
OpenClipboard(nullptr);
EmptyClipboard();
SetClipboardData(CF_BITMAP, capturedScreenBitmap);
CloseClipboard();
::SelectObject(memoryDC, memoryBitmap);
::DeleteObject(capturedScreenBitmap);
::DeleteDC(memoryDC);
::ReleaseDC(appHWnd, appDC);
奇怪的是,C#版本的代码可以正常工作。导入相同的user32库,使用相同的库并输出不同的结果?为什么?
答案 0 :(得分:0)
这取决于DPI意识-David Heffernan
:: GetWindowRect(过去用于Visual Studio中的c#项目和C ++控制台项目)不受dpi感知的缩放影响。但是,qt studio以前使用的软件会受到影响。
这是我的解决方法。
RECT appWindowRect; {
::GetWindowRect(hwnd, &appWindowRect);
}
POINT appWindowSize; {
qreal dotsPerInch = QApplication::screens().at(0)->logicalDotsPerInch();
appWindowSize.x = static_cast<LONG>((appWindowRect.right - appWindowRect.left) * 96 / dotsPerInch);
appWindowSize.y = static_cast<LONG>((appWindowRect.bottom - appWindowRect.top) * 96 / dotsPerInch);
}