如何创建读取帧缓冲区的模块,并将内容保存为图像

时间:2009-12-15 23:09:29

标签: winapi directx gdi

在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应用程序的情况下创建此模块呢?

3 个答案:

答案 0 :(得分:1)

你不需要使用WinMain()来使用GDI - 只需链接相应的库,你就可以了。

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

答案 1 :(得分:1)

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

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

答案 2 :(得分:1)

如果我正确地阅读您的问题,听起来您似乎想要编写一个执行屏幕捕获的控制台应用程序(非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);