截屏方法生成黑图在c#中使用control.drawtobitmap失败后,我的第二个选择是对桌面进行截图并裁剪出所需的部分。一旦我切换用户帐户,我就开始打嗝,虽然程序没有崩溃,但一旦用户切换,程序就会产生一个纯黑的图像。我使用此代码作为参考:WebBrowser.DrawToBitmap()或其他方法?我认为这在逻辑上是有道理的,因为它将帮助Windows节省资源。我的情况有哪些选择/解决方案?编辑1修改代码进行测试:intc=0;while(true){try{c++;矩形formBounds=this.Bounds;位图bmp=newBitmap(formBounds.Width,formBounds.Height);使用(Graphicsg=Graphics.FromImage(bmp))g.CopyFromScreen(formBounds.Location,Point.Empty,formBounds.Size);bmp.Save("图片"+c.ToString()+".jpg");线程.睡眠(5000);}catch(Exceptionex){MessageBox.Show(ex.ToString());这在用户帐户上完美运行,但一旦我切换用户,它就会返回异常:无效句柄。有任何想法吗?编辑2:DrawToBitmap中的错误不是随机的...如果我使用您提供的代码:Bitmapbmp=newBitmap(this.ClientRectangle.Width,this.ClientRectangle.Height);this.DrawToBitmap(bmp,this.ClientRectangle);bmp.Save(".\picture.jpg");它完美地工作,例如:http://oi61.tinypic.com/1z23ynp.jpg但是,当我右键单击webbrowser控件时,DrawToBitmap返回空白图像。例如:http://oi60.tinypic.com/9ay0yc.jpg所以我可以通过添加((Control)webbrowser1).Enabled=false;轻松克服这个错误;这使得无法点击网络浏览器上的任何内容,但不幸的是,禁用它会使我的项目无用,因为它的主要功能是模仿鼠标点击网络浏览器控件。如果窗口被隐藏,这也可能是一个问题。目前我正在查看这篇文章,其中提供了提供窗口句柄的代码。模拟点击隐藏窗口似乎有一些价值……看看。DrawToBitmap有什么问题?它在这里工作正常,(W8.1,VS2013)即使在切换用户后使用Webcontrol。(但请参阅最后的条件编辑!)Bitmapbmp=newBitmap(this.ClientRectangle.Width,this.ClientRectangle.Height);this.DrawToBitmap(bmp,this.ClientRectangle);//剪贴板.SetImage(bmp);仅用于测试bmp.Dispose();下面是获取窗口截图的代码:RectangleformBounds=this.Bounds;位图bmp=newBitmap(formBounds.Width,formBounds.Height);使用(Graphicsg=Graphics.FromImage(bmp))g.CopyFromScreen(formBounds.Location,Point.Empty,formBounds.Size);//剪贴板.SetImage(bmp);仅用于测试bmp.Dispose();我可以随心所欲地切换用户,并且程序会继续运行。顺便说一句,你发布的链接真的很旧,很多东西都可以改进。编辑:有了更新的问题,事情就清楚多了。因此,即使用户已更改,您也想继续截取程序的屏幕截图,对吗?你想显示一个WebControl,对吗?用户可以拥有三种类型的桌面:登录/注销屏幕、屏保屏幕和一个或多个普通桌面屏幕。但是当用户注销时,他根本没有桌面屏幕。因此,如果用户没有活动的桌面,屏幕截图方法将不起作用,也不会像g.CopyFromScreen那样导致GDI错误,也不会像网络上的各种解决方案那样使用窗口句柄,包括那些的链接。所有这些充其量只能显示空白或黑屏。因此DrawToBitmap方法是唯一有效的方法。你写的是随机错误。那不是我看到的。当用户以任何方式与WebBrowser交互时,就会出现问题。这包括在有或没有导航的情况下滚动或单击。在这些交互之后,WebBrowser将自己绘制为一个空框,直到它的URL被重新加载——不仅是刷新——而且实际上是由webBrowser1.Uri=newUri(uriPath)重新加载的。这是可以做到的,请参阅我的另一篇文章WebBrowser在执行DrawToBitmap时还有另一个问题:对于包含元素的任何页面,它都会失败(带有所述空框)。我不确定解决这个问题的最佳方法是什么,更不用说为什么它首先发生了……屏幕截图方法没有那个具体问题。编辑2:OP通过调用PrintWindow挖出的代码似乎解决了我们遇到的所有问题:即使在单击WebBrowser并抓取所有页面(包括带有文本输入的页面)后,它也可以在注销时使用它也是可以使用Refeshing字段。欢呼!在减少松弛之后,这里有一个创建表单副本的版本,或者只是创建带有或不带边框的WebBroser(或任何其他控件)的副本:[DllImport("user32.dll")]publicstaticexternboolPrintWindow(IntPtrhwnd,IntPtrhdcBlt,uintnFlags);publicBitmapCaptureWindow(Controlctl){//位图bmp=newBitmap(ctl.Width,ctl.Height);//包含边框Bitmapbmp=newBitmap(ctl.ClientRectangle.Width,ctl.ClientRectangle.Height);//仅使用内容(Graphicsgraphics=Graphics.FromImage(bmp)){IntPtrhDC=graphics.GetHdc();试试{PrintWindow(ctl.Handle,hDC,(uint)0);}最后{graphics.ReleaseHdc(hDC);}}返回bmp;最后,即使我切换用户,这段代码似乎也能正常工作。用于截取任何未保存的记录本进程的屏幕截图的代码(“Un??titled–Notepad”)privatevoidForm1_Load(objectsender,EventArgse){//loopfordebuggingintc=0;同时(真){C++;System.Drawing.Bitmapimage=CaptureWindow(FindWindow(null,"无题-记事本"));image.Save(".\picture"+c.ToString()+".jpg");线程.睡眠(5000);}}[DllImport("user32.dll")]publicstaticexternboolPrintWindow(IntPtrhwnd,IntPtrhdcBlt,uintnFlags);[DllImport("user32.dll")]publicstaticexternIntPtrGetWindowDC(IntPtrhWnd);[DllImport("user32.dll",SetLastError=true)]staticexternIntPtrFindWindow(stringlpClassName,stringlpWindowName);publicSystem.Drawing.BitmapCaptureWindow(IntPtrhWnd){System.Drawing.RectanglerctForm=System.Drawing.Rectangle.Empty;使用(System.Drawing.Graphicsgrfx=System.Drawing.Graphics.FromHdc(GetWindowDC(hWnd))){rctForm=System.Drawing.Rectangle.Round(grfx.VisibleClipBounds);}System.Drawing.BitmappImage=newSystem.Drawing.Bitmap(rctForm.Width,rctForm.Height);System.Drawing.Graphics图形=System.Drawing.Graphics.FromImage(pImage);IntPtrhDC=graphics.GetHdc();试试{PrintWindow(hWnd,hDC,(uint)0);}最后{graphics.ReleaseHdc(hDC);}返回pImage;请注意,窗口可能会被隐藏,但仍必须在用户帐户上最大化才能获得完整的屏幕截图DRM可能会阻止这种情况,因为Windows增加了对数字媒体的保护。例如,如果您尝试使用Microsoft的图形渲染在MediaPlayer或MediaCenter中创建某些内容的屏幕截图-是的,Microsoft将“保护您免受任何潜在的诉讼”。试试这个:点击键盘上的“PrintScreen”,然后进入MicrosoftPaint并尝试将屏幕截图粘贴到其中。有没有什么?以上就是C#学习教程:截图方法生成黑图分享的全部内容。如果对你有用,需要进一步了解C#学习教程,希望大家多多关注。本文收集自网络,不代表立场。如涉及侵权,请点击右边联系管理员删除。如需转载请注明出处:
