首页 > 编程语言 >C#截图 开源组件库ShareX

C#截图 开源组件库ShareX

时间:2023-11-08 10:14:49浏览次数:316  
标签:截图 窗口 ShareX C# 区域 全屏 屏幕

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

标签:截图,窗口,ShareX,C#,区域,全屏,屏幕
From: https://www.cnblogs.com/guangzhiruijie/p/17816682.html

相关文章

  • eclipse jdk版本对应
     eclipse下载地址:https://wiki.eclipse.org/Eclipse/Installation#Eclipse_4.23_.282022-03.29  ......
  • React学习笔记20-父子通信(子传父)
    在React中子组件给父组件传参通过回调函数来进行。父组件给子组件传递一个回调函数作为属性。子组件在需要传递参数的地方调用父组件传递的回调函数即可。importReact,{Component}from'react'classNavbarextendsComponent{render(){return(......
  • c# 操作xml配置文件
     Xml配置文件<?xmlversion="1.0"encoding="utf-8"?><root><tokenStrvalue=""/><overTimevalue=""></overTime></root>Helper类//读取stringuri=Enviro......
  • javascript 手动实现 bind,call,apply
     js手动实现call方法Function.prototype.myCall=function(content,...args){letmyfn=Symbol()content=content||globalThis//console.log(content)content[myfn]=this//console.log(content)constresu......
  • C#判断字符串的显示宽度
    C#判断字符串的显示宽度起因:公司有一个使用项目使用HTML转换为PDF,其中有一个表格,表格的最后一列中的单元格,其字符串超长后会被丢弃,而不是换行到下一行展示(HtmlToPdf渲染引擎导致的,没办法更改)解决方案:根据字符串长度手动添加<br/>换行varsource="ABCD";if(GetLength(sou......
  • 华为云CodeLab中GPU: 1*P100|CPU: 8核 64GB的显卡驱动与cuda版本
    需要加!!nvidia-smi安装torch时,cuda的版本要<=11.4......
  • 游戏评测CQ9玩家困扰:iOS 17 Bug困扰苹果,iPhone 16项目调整中
    苹果近日面临着iOS更新率的放缓问题,引发了一些不满,而苹果也对此表示了关切。最新CQ9游戏评测报道指出,苹果内部已通知员工,为了应对早期版本出现大量bug的问题,他们将推迟明年的iPhone、iPad和Mac软件更新。此次的重点任务不再是新增功能,而是修复缺陷并提高软件性能。据悉,苹果的软件工......
  • How to add an image on reportViewer (rdlc)
    OpenthereportintheDesigner.IntheToolBox,select/expandthe"ReportItems"section.Dragan"Image"field/controlontothereport.ClickontheimageandpressF4,thepropertieswindow popsup,underthegroupdatayou'llf......
  • SQL Server 2005 数据库对象命名规范 Database Naming Conventions(Guidelines)
    使用SQLServer2005命名数据库对象时可以参照微软的示例数据库AdventureWorks。其次可以参照以下内容:DatabaseNamingConventionsVersion1.1LastRevisedMay13,2004byJasonMaussThemaingoalofadoptinganamingconventionfordatabaseobjectsissothatyouand......
  • 台达PLC和昆仑通态触摸屏通讯设置
    今天,我们来一起学下下台达PLC与触摸屏之间无线通信的实现方法。其中触摸屏作为主站,台达PLC作为从站,并采用日系PLC专用无线通讯终端DTD435MC,作为实现无线通讯的硬件设备。台达PLC和触摸屏通讯关键是对于通讯参数的设置。触摸屏设置首先打开设备组态对话框如图,双击设备窗口对话框。显......