屏幕捕获(CopyFromScreen无法完全运行)

时间:2013-01-03 08:18:56

标签: c# screen-capture

  

可能重复:
  How to get screenshot to include the invoking window (on XP)

我目前正在使用CopyFromScreen(0, 0, 0, 0, imageSize)来捕获桌面,但不幸的是,有一个特殊的winform内容没有捕获(其余的都没问题)。

这个winform的工作非常简单;这只是一个自动收报机程序。黑色背景和每毫秒左右移动的标签,就是这样。没有国界。

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

有趣的是,通过按下键盘的“Print Screen”并将其粘贴在MS Paint中,可以很好地捕获自动收报机程序。它只是在代码中通过CopyFromScreen无效。如何在不使用win32 API的情况下使其正常工作,或者还有其他解决方法吗?

修改

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

事实证明,我的自动收报机程序的表单已将TransparentKey设置为除null之外的任何其他内容(在本例中为maroon)。当TransparentKey not null 时,CopyFromScreen将不起作用。它只是复制一张空白图像。

有谁知道如何让两者(TransparentKey和CopyFromScreen)协同工作?洛尔

编辑2(已解决):

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

How can I save a screenshot directly to a file in 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 

现在可以使用TransparentKey捕获桌面。

1 个答案:

答案 0 :(得分:0)