C#截图 开源组件库ShareX
ShareX支持以下几种截图方式,其中全屏功能是指自动截取主屏幕桌面区域的截图(可以配置是否隐藏ShareX窗口、隐藏屏幕虚拟区域等),窗口功能是指截取屏幕中的指定进程的窗口截图(ShareX程序通过调用Windows系统的EnumWindows函数枚举屏幕中的顶层窗口,并动态生成窗口菜单的子菜单)、显示器功能是指多屏情况下截取指定屏幕的截图、矩形区域功能类似于windows自带的截图工具。本文中主要梳理并学习全屏及矩形区域功能的实现方式。
抽象类CaptureBase用于定义截图操作的基本属性和基本功能,其共有七个子类,其中CaptureFullscreen类用于全屏截图,CaptureRegion类用于区域截图。
ShareX主窗口菜单中的全屏菜单的响应函数仅包括一句代码,如下所示。但其内部逻辑是调用System.Windows.Forms.Screen 类获取显示器的工作区( 工作区是显示器的桌面区域,不包括任务栏、停靠窗口和停靠工具栏)。然后创建Screenshot类,设置该类中与截图相关的属性,主要包括CaptureCursor(截图上显示鼠标指针)、CaptureClientArea(截图时排除标题栏与边框)、RemoveOutsideScreenArea(移除屏幕中的虚拟区域)、CaptureShadow (截图窗口带阴影)、AutoHideTaskbar(截图时,如果窗口与任务栏重叠,则隐藏任务栏)等,最后调用Screenshot类中的CaptureFullscreen函数获取屏幕截图。
CaptureFullscreen().Capture(true);
CaptureFullscreen函数中主要使用以下windows函数获取屏幕截图,这些函数的作用就是将屏幕内容绘制到指定的图片中。
序号 函数名称 说明
1 GetDesktopWindow 返回桌面窗口的句柄
2 GetWindowDC 返回指定窗口的设备环境
3 CreateCompatibleDC 创建与指定设备兼容的内存设备上下文环境
4 CreateCompatibleBitmap 创建与指定的设备环境相关的设备兼容的位图
5 SelectObject 选择一对象到指定的设备上下文环境中
6 BitBlt 从原设备中复制位图到目标设备,在ShareX项目中主要用于将屏幕内容绘制到指定图片中
7 DrawIconEx 绘制图标或鼠标指针
8 DeleteDC 删除指定的设备上下文环境
9 ReleaseDC 释放设备上下文环境
10 DeleteObject 删除一个逻辑笔、画笔、字体、位图、区域或者调色板,释放所有与该对象有关的系统资源,矩形区域截图功能基于全屏截图。矩形区域截图时,首先创建Screenshot对象获取全屏截图,并以此为画板,调用RegionCaptureForm窗口实现矩形截图,最后调用RegionCaptureForm. GetResultImage函数获取矩形区域截图的图形数据。
private async void MouseDoubleClick(object sender, MouseEventArgs e)
{
if (isOcrInProgress)
{
return;
}
isOcrInProgress = true;
try
{
Image capturedImage = RegionCaptureTasks.GetRegionImage_Mo(new RegionCaptureOptions
{
ShowMagnifier = false,
UseSquareMagnifier = false,
MagnifierPixelCount = 15,
MagnifierPixelSize = 10
}, out string modeFlag, out Point capturePoint, out Rectangle[] captureRectangles);
string tempFolderPath = Path.Combine(basePath, "temp");
if (!Directory.Exists(tempFolderPath))
{
Directory.CreateDirectory(tempFolderPath);
}
string imagePath = Path.Combine(tempFolderPath, $"{Guid.NewGuid()}.png");
capturedImage.Save(imagePath, ImageFormat.Png);
frmLoading loadingForm = new frmLoading();
loadingForm.TopMost = true;
loadingForm.Show();
bool ocrResult = await Task.Run(() => this.ocrEngine.PerformOcr(imagePath, 50, 1024, 0.5f, 0.3f, 1.6f, true, false));
if (ocrResult)
{
loadingForm.isOperationSuccessful = true;
isOcrInProgress = false;
File.Delete(imagePath);
this.Invoke(new MethodInvoker(() =>
{
frmOcrResult resultForm = new frmOcrResult(this.ocrEngine.ExtractedText, this.ocrEngine.OcrTime.ToString());
resultForm.StartPosition = FormStartPosition.CenterScreen;
resultForm.Show();
resultForm.Activate();
}));
}
}
catch (Exception ex)
{
MessageBox.Show(ex.Message);
isOcrInProgress = false;
}
}
参考文献:
[1]http://news.sohu.com/a/620562619_121124363
[2]https://getsharex.com/
[3]https://github.com/ShareX/ShareX
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 【自荐】一款简洁、开源的在线白板工具 Drawnix
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
· Docker 太简单,K8s 太复杂?w7panel 让容器管理更轻松!
2022-11-08 C# .NET 支付宝接入