using System; using System.Drawing; using System.Drawing.Drawing2D; using System.Drawing.Imaging; using System.IO; using System.Threading.Tasks; using System.Windows; using System.Windows.Forms; namespace Ink_Canvas { public partial class MainWindow : Window { /// /// 保存截图 /// /// 是否隐藏通知 /// 文件名 /// /// 该方法会: /// 1. 根据设置确定保存路径 /// 2. 调用CaptureAndSaveScreenshot方法捕获并保存截图 /// 3. 如果设置了自动保存墨迹,调用SaveInkCanvasStrokes方法保存墨迹 /// private void SaveScreenShot(bool isHideNotification, string fileName = null) { var savePath = Settings.Automation.IsSaveScreenshotsInDateFolders ? GetDateFolderPath(fileName) : GetDefaultFolderPath(); CaptureAndSaveScreenshot(savePath, isHideNotification); if (Settings.Automation.IsAutoSaveStrokesAtScreenshot) SaveInkCanvasStrokes(false); } /// /// 保存截图到桌面 /// /// /// 该方法会: /// 1. 生成桌面路径和文件名 /// 2. 调用CaptureAndSaveScreenshot方法捕获并保存截图到桌面 /// 3. 如果设置了自动保存墨迹,调用SaveInkCanvasStrokes方法保存墨迹 /// internal void SaveScreenShotToDesktop() { var desktopPath = Path.Combine( Environment.GetFolderPath(Environment.SpecialFolder.DesktopDirectory), $"{DateTime.Now:yyyy-MM-dd_HH-mm-ss}.png"); CaptureAndSaveScreenshot(desktopPath, false); if (Settings.Automation.IsAutoSaveStrokesAtScreenshot) SaveInkCanvasStrokes(false); } /// /// 提取公共的截图和保存逻辑 /// /// 保存路径 /// 是否隐藏通知 /// /// 该方法会: /// 1. 获取虚拟屏幕边界 /// 2. 创建位图并设置高质量渲染 /// 3. 从屏幕复制内容到位图 /// 4. 确保保存目录存在 /// 5. 保存为PNG格式 /// 6. 如果不隐藏通知,显示保存成功通知 /// 7. 异步上传截图到Dlass /// private void CaptureAndSaveScreenshot(string savePath, bool isHideNotification) { var rc = SystemInformation.VirtualScreen; using (var bitmap = new Bitmap(rc.Width, rc.Height, PixelFormat.Format32bppArgb)) using (var memoryGraphics = Graphics.FromImage(bitmap)) { // 设置高质量渲染 memoryGraphics.CompositingQuality = CompositingQuality.HighQuality; memoryGraphics.InterpolationMode = InterpolationMode.HighQualityBicubic; memoryGraphics.SmoothingMode = SmoothingMode.HighQuality; memoryGraphics.CompositingMode = CompositingMode.SourceOver; memoryGraphics.CopyFromScreen(rc.X, rc.Y, 0, 0, rc.Size, CopyPixelOperation.SourceCopy); // 确保目录存在 var directory = Path.GetDirectoryName(savePath); if (!Directory.Exists(directory)) { Directory.CreateDirectory(directory); } // 使用PNG格式保存,确保透明度信息不丢失 bitmap.Save(savePath, ImageFormat.Png); } if (!isHideNotification) { ShowNotification($"截图成功保存至 {savePath}"); } _ = Task.Run(async () => { try { var delayMinutes = Settings?.Dlass?.AutoUploadDelayMinutes ?? 0; if (delayMinutes > 0) { await Task.Delay(TimeSpan.FromMinutes(delayMinutes)); } await Helpers.DlassNoteUploader.UploadNoteFileAsync(savePath); } catch (Exception) { } }); } /// /// 获取日期文件夹路径 /// /// 文件名 /// 日期文件夹路径 /// /// 该方法会: /// 1. 如果文件名为空,使用当前时间作为文件名 /// 2. 获取基础路径和日期文件夹名 /// 3. 组合路径并返回 /// private string GetDateFolderPath(string fileName) { if (string.IsNullOrWhiteSpace(fileName)) { fileName = DateTime.Now.ToString("HH-mm-ss"); } var basePath = Settings.Automation.AutoSavedStrokesLocation; var dateFolder = DateTime.Now.ToString("yyyyMMdd"); return Path.Combine( basePath, "Auto Saved - Screenshots", dateFolder, $"{fileName}.png"); } /// /// 获取默认文件夹路径 /// /// 默认文件夹路径 /// /// 该方法会: /// 1. 获取基础路径 /// 2. 组合截图文件夹路径 /// 3. 确保截图文件夹存在 /// 4. 生成文件名并组合完整路径返回 /// private string GetDefaultFolderPath() { var basePath = Settings.Automation.AutoSavedStrokesLocation; var screenshotsFolder = Path.Combine(basePath, "Auto Saved - Screenshots"); if (!Directory.Exists(screenshotsFolder)) { Directory.CreateDirectory(screenshotsFolder); } return Path.Combine( screenshotsFolder, $"{DateTime.Now:yyyy-MM-dd_HH-mm-ss}.png"); } } }