c#不使用系统api实现可以指定区域屏幕截屏功能

C#不使用系统API实现可以指定区域屏幕截屏功能攻略

在C#中,可以通过一些内置的或者第三方的类库来实现屏幕截屏功能。但是,有时候需要对特定区域进行截屏,本文将介绍如何使用C#实现指定区域屏幕截屏的功能,且不使用系统API,具体步骤如下:

步骤1:创建一个winform窗体应用

将以下代码添加到Main方法中:

[STAThread]
static void Main()
{
    Application.EnableVisualStyles();
    Application.SetCompatibleTextRenderingDefault(false);
    Application.Run(new Form1());
}

步骤2:添加按钮控件并创建单击事件

将以下代码添加到Form1.cs中:

private void button1_Click(object sender, EventArgs e)
{
    Bitmap bitmap = new Bitmap(Screen.PrimaryScreen.Bounds.Width, Screen.PrimaryScreen.Bounds.Height);
    using (Graphics graphics = Graphics.FromImage(bitmap))
    {
        graphics.CopyFromScreen(Point.Empty, Point.Empty, Screen.PrimaryScreen.Bounds.Size);
    }
    pictureBox1.Image = bitmap.Clone(new Rectangle(10, 10, 200, 200), bitmap.PixelFormat);
}

步骤3:测试程序

在窗体中添加一个PictureBox控件,将按钮和pictureBox控件分别拖到窗体中。单击按钮后,指定区域的截屏将会在pictureBox中显示出来。

注解

  • 该方法先截取了整个屏幕,然后对_bitmap_进行裁剪处理,选取指定区域的图像。
  • 裁剪的具体方法是使用Bitmap.Clone方法获取指定矩形位置的Bitmap位图。添加参数bitmap.PixelFormat是为确保返回的位图具有与原位图相同的像素格式。

示例

下面将演示如何实现定点截图的功能。

第一步,添加一个_CheckBox_控件和一个_Button_控件。

private void button2_Click(object sender, EventArgs e)
{
    if (!checkBox1.Checked) //全屏截图
    {
        Bitmap bitmap = new Bitmap(Screen.PrimaryScreen.Bounds.Width, Screen.PrimaryScreen.Bounds.Height);
        using (Graphics graphics = Graphics.FromImage(bitmap))
        {
            graphics.CopyFromScreen(Point.Empty, Point.Empty, Screen.PrimaryScreen.Bounds.Size);
        }
        pictureBox1.Image = bitmap.Clone(new Rectangle(0, 0, bitmap.Width, bitmap.Height), bitmap.PixelFormat);
    }
    else //截图指定区域
    {
        this.Hide();
        Thread.Sleep(200);

        Rectangle rect = Win32.GetWindowRect(Win32.GetForegroundWindow());
        Bitmap bitmap = new Bitmap(rect.Width, rect.Height);
        Graphics graphic = Graphics.FromImage(bitmap);
        graphic.CopyFromScreen(rect.X, rect.Y, 0, 0, rect.Size);
        pictureBox1.Image = bitmap;

        this.Show();
    }
}

第二步,创建一个叫做“Win32”的类,用于调用Win32 API。

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Runtime.InteropServices;
using System.Diagnostics;
using System.Windows.Forms;

namespace ScreenShotDemo
{
    public static class Win32
    {
        [DllImport("user32.dll")]
        public static extern IntPtr GetForegroundWindow();

        [DllImport("user32.dll", CharSet = CharSet.Auto, SetLastError = true)]
        public static extern int GetWindowTextLength(IntPtr hWnd);

        [DllImport("user32.dll", CharSet = CharSet.Auto, SetLastError = true)]
        public static extern int GetWindowText(IntPtr hWnd, StringBuilder lpString, int nMaxCount);

        [DllImport("user32.dll", SetLastError = true)]
        public static extern bool GetWindowRect(IntPtr hWnd, ref RECT lpRect);

        public struct RECT
        {
            public int Left;        // x position of upper-left corner
            public int Top;         // y position of upper-left corner
            public int Right;       // x position of lower-right corner
            public int Bottom;      // y position of lower-right corner
        }
    }
}

第三步,通过_GetWindowRect_方法获取前台窗口的位置和大小信息,截取整个窗口的截屏图像。

结论

通过以上步骤,我们已经可以实现指定区域的屏幕截屏功能了。因为没有使用系统API,所以该方法不会对系统的稳定性产生影响,同时对于嵌入式系统特别适用。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:c#不使用系统api实现可以指定区域屏幕截屏功能 - Python技术站

(0)
上一篇 2023年6月8日
下一篇 2023年6月8日

相关文章

  • 理解ASP.NET Core 启动类(Startup)

    在 ASP.NET Core 中,Startup 类是应用程序的入口点,它负责配置应用程序的服务和中间件。以下是 ASP.NET Core 启动类的完整攻略: 步骤一:配置服务 在 ASP.NET Core 中,可以使用 ConfigureServices 方法来配置应用程序的服务。以下是一个示例: public class Startup { public…

    C# 2023年5月17日
    00
  • PowerShell中使用.NET将程序集加入全局程序集缓存

    在PowerShell中使用.NET将程序集加入全局程序集缓存,首先需要使用Add-Type -AssemblyName命令加载程序集,然后使用[System.Reflection.Assembly]::Load()方法将加载的程序集添加至全局程序集缓存中。 以下是完整的步骤: 使用Add-Type -AssemblyName命令加载程序集 Add-Type…

    C# 2023年6月3日
    00
  • C# DateTime.AddHours()方法: 将指定的小时数加到指定的日期上

    DateTime.AddHours()的作用与使用方法 DateTime.AddHours()是C#语言中的一个方法,用于给一个日期时间加上指定的小时数,并返回新的日期时间。它的基本语法如下: public DateTime AddHours(double value) 其中 value 参数表示需要增加的小时数,可以是正数、负数或零。当 value 为正数…

    C# 2023年4月19日
    00
  • ASP.NET 程序员都非常有用的85个工具

    ASP.NET程序员都非常有用的85个工具 作为ASP.NET程序员,我们需要使用各种工具来提高我们的工作效率和代码质量。在本文中,我们将介绍85个非常有用的ASP.NET工具,这些工具可以帮助我们更好地开发和维护ASP.NET应用程序。 1. 开发工具 以下是一些非常有用的ASP.NET开发工具: 1.1 Visual Studio Visual Stud…

    C# 2023年5月15日
    00
  • C# 如何添加错误日志信息

    当我们在开发C#应用程序时,通常需要将错误日志信息输出到一个日志文件中,以便于在应用出现问题时能够及时定位错误并进行跟踪。本文将介绍如何在C#应用程序中添加错误日志信息。 1. 引入命名空间 using System.IO; 2. 创建日志文件 string logFilePath = @"C:\Logs\myLog.txt"; Stre…

    C# 2023年5月15日
    00
  • C# WinForm创建Excel文件的实例

    以下是C# WinForm创建Excel文件的实例攻略。 第一步:安装Excel应用程序 在使用C# WinForm创建Excel文件之前,我们需要确保已安装Excel应用程序。如果没有安装,可以前往微软官网下载安装。 第二步:添加引用 我们需要通过添加引用来调用Excel的COM组件。在Visual Studio中,右键点击“引用”,选择“添加引用”,在弹…

    C# 2023年6月1日
    00
  • c#通过app.manifest使程序以管理员身份运行

    下面是详细讲解“c#通过app.manifest使程序以管理员身份运行”的完整攻略: 1. 为何需要以管理员身份运行程序 在Windows系统中,一些操作需要管理员权限才能够执行,例如修改系统配置、创建和删除文件夹等等。对于这些需要管理员权限的操作,我们需要以管理员身份运行程序才能够正常执行。 2. 如何使用app.manifest来使程序以管理员身份运行 …

    C# 2023年6月1日
    00
  • C# dump系统lsass内存和sam注册表详细

    首先我们需要了解一下“C#dump系统lsass内存和sam注册表详细”是什么。 lsass.exe是Windows系统的一个进程,它主要负责对用户登录信息进行验证和授权。lsass.exe在Windows系统启动时自动运行,并且至关重要。SAM(Security Accounts Manager)注册表是Windows系统中的一个数据库,其中存储着用户名和…

    C# 2023年5月15日
    00
合作推广
合作推广
分享本页
返回顶部