Windows GDI 窗口与 Direct3D 屏幕截图( 三 )

使用示例其中使用了窗口枚举辅助类 , 详细代码请看文章末尾的 Github 项目 。支持 .Net Core 。
1static async Task Main(string[] args) 2{ 3Console.Write("按任意键开始DX截图……"); 4Console.ReadKey(); 56string path = @"E:截图测试"; 78var cancel = new CancellationTokenSource(); 9await Task.Run(() =>10{11Task.Run(() =>12{13Thread.Sleep(5000);14cancel.Cancel();15Console.WriteLine("DX截图结束!");16});17var savePath = $@"{path}DX";18Directory.CreateDirectory(savePath);19 20using var dx = new DirectXScreenCapturer();21Console.WriteLine("开始DX截图……");2223while (!cancel.IsCancellationRequested)24{25var (result, isBlackFrame, image) = dx.GetFrameImage();26if (result.Success && !isBlackFrame) image.Save($@"{savePath}{DateTime.Now.Ticks}.jpg", ImageFormat.Jpeg);27image?.Dispose();28}29}, cancel.Token);30 31var windows = WindowEnumerator.FindAll();32for (int i = 0; i < windows.Count; i++)33{34var window = windows[i];35Console.WriteLine($@"{i.ToString().PadLeft(3, ' ')}. {window.Title}36{window.Bounds.X}, {window.Bounds.Y}, {window.Bounds.Width}, {window.Bounds.Height}");37}38 39var savePath = $@"{path}Gdi";40Directory.CreateDirectory(savePath);41Console.WriteLine("开始Gdi窗口截图……");42 43foreach (var win in windows)44{45var image = CaptureWindow.ByHwnd(win.Hwnd);46image.Save($@"{savePath}{win.Title.Substring(win.Title.LastIndexOf(@"") < 0 ? 0 : win.Title.LastIndexOf(@"") + 1).Replace("/", "").Replace("*", "").Replace("?", "").Replace(""", "").Replace(":", "").Replace("<", "").Replace(">", "").Replace("|", "")}.jpg", ImageFormat.Jpeg);47image.Dispose();48}49Console.WriteLine("Gdi窗口截图结束!");50 51Console.ReadKey();52}结语这个示例代码中的 DX 截图只支持 win7 以上版本 , xp 是时候退出历史舞台了 。代码参考了网上大神的文章 , 并根据实际情况进行改造 , 尽可能简化实现和使用代码 , 展示最简单情况下所必须的代码 。如果实际需求比较复杂 , 可以以这个为底版进行改造 。




推荐阅读