【问题标题】:Screen Capture (CopyFromScreen didn't work fully) [duplicate]屏幕捕获(CopyFromScreen 不能完全工作)[重复]
【发布时间】:2013-01-03 08:18:56
【问题描述】:

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

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

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

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

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

编辑:

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

事实证明,我的股票代码程序的表单已将 TransparentKey 设置为 null 以外的任何内容(在本例中为栗色)。当 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 捕获桌面。

【问题讨论】:

  • 本文中的示例对您有用吗? codeproject.com/Articles/274461/…
  • 感谢您的回复!不,它没有 =( 已经尝试过了,但如前所述,我无法访问前端缓冲区。

标签: c# screen-capture


【解决方案1】:

【讨论】:

  • 我会接受这个作为答案,因为这让我找到了最终的解决方案。我发现 CopyFromScreen 实际上是 BitBlt 的包装器。我没有调用 CopyFromScreen,而是在此处使用 BitBlt 调用:stackoverflow.com/questions/158151/… 但是,我稍微修改了代码:更改为: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 捕获桌面。
猜你喜欢
  • 2012-11-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-04-19
  • 2016-12-31
  • 1970-01-01
相关资源
最近更新 更多