c#中使用CopyFromScreen截图为啥截不到图片???

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了c#中使用CopyFromScreen截图为啥截不到图片???相关的知识,希望对你有一定的参考价值。

Bitmap img = new Bitmap(10, 10);
Graphics g = Graphics.FromImage(img);
Size mySize = new Size(10, 10);
g.CopyFromScreen(this.PointToScreen(this.videoPanel.Location).X + 45,this.PointToScreen(this.videoPanel.Location).Y + 35, 0, 0, mySize);
img.save("c:/a.jpg");为什么保存是黑屏
videPanel面板中有图像

因为视频输出一般都不是走GDI技术路线(GDI效率比较低,无法适应视频的播放速度),所以视频基本都是硬件加速实现的。所以普通的截屏是截图截不到的。
可能要用DirectX。

或者也可以用 系统自带的屏幕截图,调用API,模拟按键进行屏幕截图,实现。追问

DirectX这个得安装到客户机上吧?那系统自带没用过,可否详细下不?急....

追答

DirectX,一般来说绝大多数电脑上都有安装,是系统自带的。
这个本来是微软用来给开发游戏的人去用的。
后来出现了DirectShow。据说比较适合视频。所以。。。
C#要操作DirectX比较困。除非自己P/Invoke。
即使是P/Invoke 也比较困难。好像要找到DLL然后根据API文档,导出DLL函数才OK。

追问

那请问下系统自带的截屏呢?看过好像没用也是黑的..

追答

那要看,这个软件有没有开启视频加速功能了,不少软件为了提高显示的质量都用了硬件加速技术,如果开启就 很可能 就截不到图了,尤其是Xp等上一代NT。
我记得貌似 迅雷看看 就是这样,
不过,我刚才截图还是成功了,可能是因为我用的是Win7 吧。

参考资料:原创

参考技术A 如果猜得不错,你是在 videoPanel 中播放视频,希望可以截取指定大小的图像
依稀记得,播放设备和程序的窗口本身是无关,是系统在指定句柄的窗口上另外生成的。
所以,你可以尝试截取全屏幕的图像,然后转换坐标,再截取指定位置的图像。追问

没用的,有视频的就会黑屏.

追答

// vs2010 / Win7 / dotNet 4.0
// 貌似我的可以截取,WMP 和 完美解码 测试成功,你试试
// cmd:Button 代码写在 Form_Load 里
cmd.Click += (obj, args) =>

var size = System.Windows.Forms.Screen.PrimaryScreen.Bounds.Size;
var bitmap = new System.Drawing.Bitmap(size.Width, size.Height);
var g = System.Drawing.Graphics.FromImage(bitmap);
g.CopyFromScreen(0, 0, 0, 0, size);
bitmap.Save("C:\\screen.png", System.Drawing.Imaging.ImageFormat.Png);
;

C# 截图程序无法“看到”Adobe AIR 程序

【中文标题】C# 截图程序无法“看到”Adobe AIR 程序【英文标题】:C# screenshot program cannot "see" Adobe AIR programs 【发布时间】:2009-11-05 19:42:02 【问题描述】:

你好, 我用 C# 编写了一个程序来截取屏幕上的矩形区域。但是我似乎无法从 Adob​​e AIR 应用程序中捕获信息。相反,下面的应用程序是我最终得到的。

动作的核心围绕 System.Drawing.Graphics.CopyFromScreen - 传递相当于左上角的点和大小并抓住该区域。到目前为止,我对其他任何事情都没有任何问题,包括网页中的 Flash 电影。

我真的不知道去哪里找,我的谷歌搜索让我相信我是唯一遇到过这种情况的人。 :O

有任何想法吗?

【问题讨论】:

【参考方案1】:

使用打印屏幕键在 Windows 剪贴板上截取 Adob​​e AIR 应用程序的屏幕截图。将屏幕截图粘贴到 MS Paint 中。如果您在屏幕截图中没有看到 Adob​​e AIR,那么这是一个加速问题 - Adob​​e AIR 使用硬件加速表面(即 DirectX 或 OpenGL)进行所有渲染,这意味着它不存在于软件屏幕缓冲区中(有一些方法可以在其他应用程序中截取加速表面的屏幕截图,但这非常专业)。

【讨论】:

非常好的观点。我们在我们的 AIR 应用程序上使用某些设置(这些都是内部生成的)。我会调查这些选项是否会将其推向加速表面。 到目前为止我的发现是一致的 - 任何具有自定义 chrome 的 AIR 应用程序都无法正常筛选,但任何使用标准 windows chrome 的应用程序都可以以通常的方式捕获。再次感谢! - 这给了我一个开始寻找的地方【参考方案2】:

这对你没有帮助,但我只是拼凑了一个快速的 WinForms 应用程序来尝试它,我能够使用 CopyFromScreen 函数截取 TweetDeck 的屏幕截图。

【讨论】:

我只试用了我们公司内部构建的应用程序。我会调查外部的。谢谢。 是的,我可以截屏 tweetdeck。我们使用无铬 AIR 窗口。我会看看这是否与它有关

以上是关于c#中使用CopyFromScreen截图为啥截不到图片???的主要内容,如果未能解决你的问题,请参考以下文章

C# 截图程序无法“看到”Adobe AIR 程序

在C#中如何实现winform窗体的全屏截图功能

C#制作截图软件时,怎样不截取软件窗口本身? 看下图:软件自身也被截下来了

屏幕截图

C# 截获某个域中未捕获的异常

CopyFromScreen在屏幕缩放情况下需要做处理