Printwindow 打印有空白区域

Posted

技术标签:

【中文标题】Printwindow 打印有空白区域【英文标题】:Printwindow prints with empty space 【发布时间】:2019-07-28 19:31:41 【问题描述】:

应用程序 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 库,使用相同的库并输出不同的结果?为什么?

【问题讨论】:

您应该在将HBITMAPmemoryDC 中取消选择之前将其提供给剪贴板,但更重要的是不要在将HBITMAP 提供给剪贴板之后将其删除! SetClipboardData() 拥有所有权,它不会复制。这在SetClipboardData() 文档中有明确的解释。此外,调用OpenClipboard() 将产生一个空的HWND 也是SetClipboardData() 文档中提到的错误。不要这样做。 我发现C和C#之间的区别不是::PrintWindow而是::GetWindowRect。我不知道为什么... 这将取决于 DPI 意识 @David Heffernan 完全正确。谢谢! @user3244483 您可以回答自己的问题并提供解决方案以帮助其他人在此问题上进行搜索。 【参考方案1】:

这将取决于 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);

【讨论】:

以上是关于Printwindow 打印有空白区域的主要内容,如果未能解决你的问题,请参考以下文章

打印 CSS:顶部空白

表格视图中的这个空白区域是啥?

Flex 窗口 - 单击空白区域

手机右侧的空白区域

tableView 的顶部有一些空白区域

检测对 UITableView 空白区域的点击