Vista中的MFC应用程序无法使用屏幕截图

问题描述:

我们有一些内置的应用程序,内置在MFC中,带有OpenGL绘图程序。它们都使用相同的代码在屏幕上绘制并打印屏幕或将其保存为JPEG文件。在Windows XP中一切正常,我需要找到一种方法让它们在Vista上运行。Vista中的MFC应用程序无法使用屏幕截图

在我们的三个应用程序中,一切正常。在剩下的一个中,我可以获得窗口边框,标题栏,菜单和任务栏,但内部从不显示。正如我所说的,这些应用程序使用完全相同的代码写入屏幕并捕获窗口图像,我看到的唯一区别看起来可能相关的是,问题应用程序使用MFC多文档界面,而使用MFC该工作使用单个文档界面。

答案不是在网上,或者我在Google上比在想象中更糟。我问MSDN论坛,我得到的唯一实际建议是使用GDI +而不是GDI,而且没有任何不同。我已经尝试了与捕获和打印或保存代码的每个部分不同的东西,只要给出一个指向窗口的指针,显然这是窗口本身的问题。我还没有使用SDI重建违规应用程序,而且我真的没有任何其他想法。

有没有人看过类似的东西?


我得到的是四个应用程序。他们使用了大量的通用代码,并共享实际的.h和.cpp文件,因此我知道绘图和屏幕捕获代码是相同的。

有一个WindowtoDIB()例程,它接受一个* pWnd和一个源矩形和目标大小。它看起来像微软的微代码很适应,并且我在Microsoft网站上的这个文件中发现了其他功能。在我的四个应用程序中,三个处理这个很好,但一个没有。最明显的区别是问题一是MDI。

它看起来像我* * pWnd是问题。我不是一个长期的MFC大师,在我看来,问题可能是我们在SDI中有一个窗口设置,在MDI中有一个以上的窗口设置。我可能会将错误* pWnd传递给函数。

与此同时,它已开始在64位Vista测试机器上正常工作,但它仍不能在32位Vista机器上工作。我不知道为什么。自从上次测试以来,我没有改变任何东西,我也没有想到其他人有过。 (在32位版本中,“打印屏幕”按键按预期工作,但不会将屏幕保存为JPEG格式。)

我们最终通过创建一个不同的OpenGL上下文来解决这个问题,并绘制了一切。我们放弃了屏幕截图。

每个窗口的内容均为directX表面,并且仅由窗口管理器在显卡。除非您关闭新界面(DWM)或专门用于从DWM进行屏幕截图的代码,否则无法捕获这些内容。

*有Desktop Window Manager (DWM)

你的问题的标题很好的说明中提到的屏幕捕获,但您的实际问题没有。请详细说明。是否可以对三个应用程序执行屏幕截图,但不是第四个?您可以使用不同的可捕获OpenGL/DirectX窗口的截屏软件。这些表面由窗口管理器直接处理,不会显示出简单的“PrtScn”。

切换到GDI +不会解决它,也不会切换到SDI。

对不起,我还是不明白。您正试图让Print Screen键在所有四个应用程序上工作?或者你正试图让WindowtoDIB()函数工作,这需要应用程序本身的“截图”(从你自己的应用程序中),以便它可以保存为图像文件?

此外,您的'他打印屏幕键是否按预期工作,但它不会将屏幕保存为JPEG'。打印屏幕只复制到剪贴板,粘贴到Paint中会发生什么?

如果您的WindowtoDIB()函数仅'捕捉'您传递给它的窗口,那么是的,您的MDI子窗口不会显示出来。

+0

我很抱歉不清楚。我想让WindowToDIB()工作。我并不关心打印屏幕。通过“按预期工作”,我的意思是,alt-Print Screen和粘贴到Word(作品,并方便调出)显示窗口,因为我看到它。您对儿童窗户的评论Roel看起来很可能就是我要找的。但是,调用来自* View类,它是CView的子类,它是cWnd的子类。因此,在我看来,我应该已经拥有了正确的cWnd。 – 2008-09-18 17:18:20

如果是你想要的CView的内容,那么是的,那应该是正确的。如果它是整个屏幕的内容(至少是内容,没有工具栏和状态栏),那么你应该把它传递给CMainFrame(这是默认的名称,可能已经改变了,从CMDIFrameWnd派生的) )。

你能发布WindowToDIB()的代码吗?我刚刚尝试过,它适用于我(TM),但在视图中没有OpenGL代码。尝试将以下窗口传递给WindowToDIB()函数:

CMainFrame * mainfrm = static_cast(:: AfxGetMainWnd());

  • mainfrm

  • mainfrm-> MDIGetActive()

  • mainfrm-> MDIGetActive() - > GetActiveView()

,看看你会得到什么。

+0

您似乎正在讨论使用“答案”作为帖子。如果由于某种原因某人投票选择其中一个答案,这是没有意义的。这就是评论部分的目的! – 2008-09-19 19:57:57