【问题标题】:How to create a module that reads the frame buffer, and saves the content as an image如何创建读取帧缓冲区并将内容保存为图像的模块
【发布时间】:2010-12-27 00:52:25
【问题描述】:

在 Windows 中,似乎至少有两种方法可以访问帧缓冲区:GDI 和 DirectX。

问题在于,为了使用 GDI 或 DirectX,您似乎必须运行一个 GUI 应用程序,然后您可以从该应用程序调用适当的 GDI 和 DirectX 函数。例如:

#include <windows.h>

int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow)
{
    // Insert frame buffer reading via GDI here.
    return 0;
}

但是,我希望创建一个包含一个函数的模块,该函数将读取帧缓冲区的内容并将其保存为图像。该模块将与更大的应用程序链接。

那么,我如何在不运行实际 GUI 应用程序的情况下创建此模块?

【问题讨论】:

  • 哪个帧缓冲?每个窗口都有自己的,窗口管理器每个显示器至少有一个...
  • 保存整个桌面的帧缓冲区。
  • 当 Windows 2000 引入多层窗口并且在 Vista 中默认启用桌面合成时,情况不再是这样

标签: winapi directx gdi


【解决方案1】:

您不需要 WinMain() 即可使用 GDI - 只需链接到相应的库即可。

您可以创建创建窗口的控制台应用程序。 WinMain() 没有特别的需要。如果您需要HINSTANCE,可以致电GetModuleHandle(NULL)

【讨论】:

    【解决方案2】:

    真的没有那么简单。对于一个 GDI 和 DirectX 使用完全不同的方式来存储帧缓冲区信息。

    例如,要拦截 DirectX 缓冲区,您需要拦截 DirectX 调用,然后在调用存在时将帧缓冲区抓取到文件中。

    【讨论】:

      【解决方案3】:

      如果我正确阅读了您的问题,听起来您想编写一个执行屏幕捕获的控制台应用程序(非 GUI)。如果是这样,只需谷歌屏幕截图,您就会找到各种代码示例,所有这些示例都执行几乎相同的步骤,使用 GetDC(0) 获取桌面的 HDC,然后使用 BitBlt 从中复制作为源 DC 到您创建的内存位图的 DC,然后将您的位图写入磁盘。请注意,在控制台应用程序中执行此操作很简单,而从 NT 服务执行此操作则不然。此外,如果没有一些非常繁琐的额外工作,某些应用程序(视频、OpenGL 等)的客户区将不会被捕获。

      另一种方法是让您的应用使用 SendKeys API 函数来模拟 Shift+PrintScreen,然后检索剪贴板并将其写入文件。

      如果您使用的是 C,请使用此代码而不是 SendKeys。

      // Simulate press of "Shift+PrintScrn"...
      keybd_event(VK_SHIFT, 0, 0, 0);
      keybd_event(VK_SNAPSHOT, 0, 0, 0);
      // then release...
      keybd_event(VK_SHIFT, 0, KEYEVENTF_KEYUP, 0);
      keybd_event(VK_SNAPSHOT, 0, KEYEVENTF_KEYUP, 0);
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-07-29
        • 1970-01-01
        • 2014-07-13
        • 2019-11-26
        • 1970-01-01
        相关资源
        最近更新 更多