Windows 10 中非活动桌面上的 PrintWindow
Posted
技术标签:
【中文标题】Windows 10 中非活动桌面上的 PrintWindow【英文标题】:PrintWindow on inactive desktop in Windows 10 【发布时间】:2017-09-26 17:56:26 【问题描述】:因此,我在尝试使用 PrintWindow API 为位于非活动桌面中的窗口拍照时遇到了一个问题,这让我开始紧张。
问题在于,对于特定的窗口,即使 PrintWindow 成功并且我得到了我想要的窗口的图像,该图像始终是上次桌面处于活动状态时的过时副本。起初我以为窗口没有收到任何输入,但经过一番检查后,我注意到它仍然接收并处理输入,但在其桌面再次激活之前不会呈现任何更改。我在 Windows 7 和 10 中进行了测试,但这只发生在 Windows 10 中。
经过一番检查,我发现主窗口实际上按照预期更新了自己,并且它是它的子窗口,它覆盖了主窗口的所有客户区,谁是罪魁祸首。这 2 个窗口是使用以下样式创建的:
类样式: 0x00000003 = CS_VREDRAW | CS_HREDRAW
父扩展样式:0x00000000
父标准样式:0x96000000 = WS_POPUP | WS_VISIBLE | WS_CLIPCHILDREN | WS_CLIPSIBLINGS
子扩展样式:0x00000020 = WS_EX_TRANSPARENT
子标准样式:0x56300000 = WS_CHILD | WS_VISIBLE | WS_CLIPCHILDREN | WS_CLIPSIBLINGS | WS_HSCROLL | WS_VSCROLL
我已经尝试了无数次尝试来解决这个问题,并且我已经广泛搜索了网络,但都无济于事。我很沮丧,如果没有人至少能对此做出解释,我已经准备好放弃了。
【问题讨论】:
“非活动桌面”是什么意思? 没有足够的程序员为 WM_PRINTCLIENT 编写消息处理程序。很容易做到,只是他们没有想到。这使得正确实现 PrintWindow() 变得困难。解决方法没有记录,但我想 Aero 创建的支持位图会很有用。当桌面不活动时,它不再更新。类似的东西。 @VTT 一个当前对用户不可见的桌面。 你说的是"virtual desktops" introduced in Windows 10吗? @HansPassant “Aero 创建的支持位图”是什么意思?我的下一个尝试是代表窗口实现我自己的 WM_PRINT/WM_PRINTCLIENT,尽管我并不完全熟悉这是如何完成的,而且因为我认为这不是问题所在,因为所有不处理的窗口PrintWindow 通常只返回一个空位图而不是过时的位图。 【参考方案1】:Windows 不会渲染不可见的窗口。您将获得当前图像,这与将鼠标悬停在任务栏图标上时获得小预览窗口时获得的图像相同。 如果程序本身没有显式调用渲染函数,窗口将不会更新。如果窗口更新,将无法获得窗口当前外观的屏幕截图。
【讨论】:
同一桌面上的其他窗口使用 PrintWindow 呈现正常,甚至同一个窗口也会在 Windows 7 中呈现。这是 Windows 10 唯一的问题。 这让我很吃惊。我认为覆盖的窗口根本不会更新是预期的行为。 我也尝试过使用几种不同的方法强制窗口重新绘制,但我所做的只是擦除窗口的内容,在重新激活桌面之前不会重新绘制这些内容。以上是关于Windows 10 中非活动桌面上的 PrintWindow的主要内容,如果未能解决你的问题,请参考以下文章
支持 ARM 上的 Windows 10 桌面应用程序 - MFC 和 COM 和 OPOS 是不是有效?