WPF:如何截屏我想修改如下,实现所有显示器的截屏。我试过调整它的大小,但我的图像是空白的。写到test.png是为了测试。byte[]将被发送到接收应用程序。publicbyte[]Take(){intscreenWidth=Convert.ToInt32(SystemParameters.VirtualScreenWidth);intscreenHeight=Convert.ToInt32(SystemParameters.VirtualScreenHeight);intscreenLeft=Convert.ToInt32(SystemParameters.VirtualScreenLeft);intscreenTop=Convert.ToInt32(SystemParameters.VirtualScreenTop);RenderTargetBitmaprenderTarget=newRenderTargetBitmap(screenWidth,screenHeight,96,96,PixelFormats.Pbgra32);VisualBrushsourceBrush=newVisualBrush();DrawingVisualdrawingVisual=newDrawingVisual();DrawingContextdrawingContext=drawingVisual.RenderOpen();使用(drawingContext){drawingContext.PushTransform(newScaleTransform(1,1));drawingContext.DrawRectangle(sourceBrush,null,newRect(newPoint(0,0),newPoint(screenWidth,screenHeight)));}renderTarget.Render(drawingVisual);PngBitmapEncoderpngEncoder=newPngBitmapEncoder();pngEncoder.Frames.Add(BitmapFrame.Create(renderTarget));字节[]_imageArray;使用(MemoryStreamoutputStream=newMemoryStream()){pngEncoder.Save(outputStream);_imageArray=outputStream.ToArray();}使用(FileStreamstream=newFileStream(@"c:test.png",FileMode.Create,FileAccess.ReadWrite)){使用(BinaryWriterwriter=newBinaryWriter(stream)){writer.Write(_imageArray);}}返回_imageArray;首先,您需要添加对以下命名空间的引用:usingSystem.Drawing;使用System.Drawing.Imaging;使用System.Windows.Forms;然后枚举您的监视器以获取所有显示表面的边界矩形并将它们传递给Graphics.CopyFromScreen()方法调用:privatestaticBitmapSourceCopyScreen(){varleft=Screen.AllScreens。最小值(屏幕=>屏幕.Bounds.X);vartop=Screen.AllScreens.Min(screen=>screen.Bounds.Y);varright=Screen.AllScreens.Max(screen=>screen.Bounds.X+screen.Bounds.Width);varbottom=Screen.AllScreens.Max(screen=>screen.Bounds.Y+screen.Bounds.Height);var宽度=右-左;var高度=底部-顶部;使用(varscreenBmp=newBitmap(width,height,System.Drawing.Imaging.PixelFormat.Format32bppArgb)){使用(varbmpGraphics=Graphics.FromImage(screenBmp)){bmpGraphics.CopyFromScreen(left,top,0,0,newSystem.Drawing.Size(width,height));返回Imaging.CreateBitmapSourceFromHBitmap(screenBmp.GetHbitmap(),IntPtr.Zero,Int32Rect.Empty,BitmapSizeOptions.FromEmptyOptions());请记住,虽然显示器通常不能整齐地放入一个矩形中,尤其是当它们具有不同的分辨率等时,所以您最好使用单个屏幕无论哪种方式,解决问题的方法是更改传递给Graphics.CopyFromScreen()方法调用的坐标。编辑:请参阅下面DemetrisLeptos的评论,我在此答案中发布的代码应该在screenBmp.GetHbitmap()返回的位图上调用DeleteObject以避免内存泄漏,如MSDN文档中所述。以上就是C#学习教程的全部内容:WPF:获取截图的方法。如果对你有用,需要进一步了解C#学习教程,希望大家多多关注。本文收集自网络,不代表立场。如涉及侵权,请点击右侧联系管理员删除。如需转载请注明出处:
