代码之家  ›  专栏  ›  技术社区  ›  David Thornley

在Vista中,屏幕捕获在MFC应用程序上不起作用

  •  0
  • David Thornley  · 技术社区  · 16 年前

    我们有一些内置于MFC的内部应用程序,以及OpenGL绘图例程。它们都使用相同的代码在屏幕上绘制,或者打印屏幕,或者将其保存到jpeg文件中。在WindowsXP中一切都正常,我需要找到一种方法让它们在Vista上工作。

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

    要么答案不在网上,要么我的谷歌搜索能力比我想象的还要差。我在msdn论坛上问,我得到的唯一实用建议是使用gdi+,而不是gdi,没有什么不同。我尝试过对代码的每个部分进行不同的处理,捕捉、打印或保存,并给出了一个指向窗口的指针,所以很明显这是窗口本身的问题。我还没有使用SDI重新构建有问题的应用程序,我真的没有其他想法。

    有人见过这样的东西吗?


    我有四份申请表。它们使用很多公共代码,共享实际的.h和.cpp文件,所以我知道绘图和屏幕捕获代码是相同的。

    有一个windowtodib()例程接受一个*pwnd、一个源矩形和目标大小。它看起来有点适应了微软的代码,我在微软的网站上找到了这个文件中的其他功能。在我的四个应用程序中,有三个处理得很好,但有一个处理得不好。最明显的区别是问题一是MDI。

    在我看来,*pwnd是问题所在。从长远来看,我不是一个MFC专家,在我看来,问题可能在于我们在SDI中有一个窗口设置,而MDI中有多个窗口设置。我可能给函数传递了错误的*pwnd。

    同时,它已经开始在64位Vista测试机上正常工作,尽管它仍然不能在32位Vista机器上工作。我不知道为什么。自从上次考试以来,我什么都没变,我也不认为还有其他人变过。(在32位版本中,打印屏幕键按预期工作,但不会将屏幕保存为jpeg。)

    5 回复  |  直到 16 年前
        1
  •  1
  •   Roel    16 年前

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

    切换到gdi+既不能解决问题,也不能切换到sdi。

        2
  •  1
  •   Jyoti mishra Mike Bonnell    6 年前

    如果你想要的是cView的内容,那么是的,应该是正确的。如果它是整个屏幕的内容(至少是内容,没有工具栏和状态栏),那么您应该将cmainframe传递给它(这是可能已更改的默认名称,是从cmdiframewnd派生的名称)。

    你能发布windowtodib()的代码吗?我刚试过,它对我(tm)有效,但视图中没有OpenGL代码。尝试将以下窗口传递给WindowToDib()函数:

    主机架* mainfrm = static_cast<CMainFrame*>(::AfxGetMainWnd());

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

    看看你得到了什么。

        3
  •  0
  •   Ray Hayes    16 年前

    每个窗口的内容都是DirectX曲面,仅由图形卡中的窗口管理器组装。除非关闭新接口(dwm)或专门用于从dwm捕获屏幕的代码,否则无法捕获此内容。

    维基百科对 Desktop Window Manager (DWM)

        4
  •  0
  •   Roel    16 年前

    对不起,我还是不明白。你想让打印屏幕键在所有四个应用程序上工作?或者您正在尝试让windowtodib()函数工作,它将获取应用程序本身的“屏幕截图”(在您自己的应用程序中),以便将其保存为图像文件?

    另外,“打印屏幕键按预期工作,但不将屏幕保存为jpeg”是什么意思?打印屏幕只复制到剪贴板,当你在画图中粘贴时会发生什么?

    如果windowtodib()函数只“捕获”传递给它的窗口,那么是的,MDI子窗口不会出现。

        5
  •  0
  •   David Thornley    15 年前

    我们最终通过创建一个不同的OpenGL上下文来解决这个问题,并将所有内容都绘制到这个上下文中。我们放弃了截屏。