0

可能重复:
如何获取包含调用窗口的屏幕截图(在 XP 上)

我目前正在使用CopyFromScreen(0, 0, 0, 0, imageSize)捕获桌面,但不幸的是,它没有捕获特定的 winform 内容(其余的都可以)。

这个winform的工作很简单;这只是一个股票程序。黑色背景和每毫秒左右移动的标签,仅此而已。没有边界。

我不能使用 Directx 的 CaptureScreen(我已经尝试过),因为显卡的驱动程序不允许我访问前缓冲区(后缓冲区中没有任何内容)。我也不能使用SendKey({PRTSC}),因为我不能覆盖剪贴板的内容。

然而有趣的是,通过按下键盘的“打印屏幕”并将其粘贴到 MS Paint 中,自动收录程序被完美捕获。CopyFromScreen它只是在代码中不起作用。我如何让它工作,或者在不诉诸 win32 API 的情况下是否有任何其他解决方法?

编辑:

我发现了为什么它不起作用。

事实证明,我的代码程序的表单将 TransparentKey 设置为null 以外的任何值(在本例中为栗色)。当 TransparentKey不为 null时, CopyFromScreen 将不起作用。它只是复制一个空白图像。

有谁知道如何让两者(TransparentKey 和 CopyFromScreen)一起工作?哈哈

编辑 2(已解决):

如下所示,我发现 CopyFromScreen 实际上是 BitBlt 的包装器。我没有调用 CopyFromScreen,而是在这里使用了 BitBlt 调用:

如何将屏幕截图直接保存到 Windows 中的文件?

但是,我稍微修改了代码。将调用更改为:

WIN32_API.BitBlt(hMemDC, 0, 0,size.cx,size.cy, hDC, 0, 0, WIN32_API.SRCCOPY | WIN32_API.CAPTUREBLT);

并将其添加到 WIN32_API 类:

public const int CAPTUREBLT = 1073741824 

现在可以使用透明键捕获桌面。

4

1 回答 1

0

将屏幕捕获为位图http://www.csharphelp.com/2006/11/capturing-the-screen-image-using-c/可能会有所帮助。

于 2013-01-03T08:42:40.083 回答