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日

相关文章

  • C#+无unsafe的非托管大数组示例详解(large unmanaged array in c# without ‘unsafe’ keyword)

    “C#+无unsafe的非托管大数组示例详解”是讲述如何在C#语言中创建非托管的大数组,且不使用“unsafe”关键字的方法。具体攻略如下: 为什么需要创建非托管大数组 C#语言是一门高级语言,无需开发人员手动管理内存,这种自动化内存管理方式称为托管内存。在某些场景下,我们可能需要创建大数组或读写大文件,托管内存会影响性能或引发内存不足等问题。这时候,我们可…

    C# 2023年6月7日
    00
  • 如何实现定时推送的具体方案

    要实现定时推送,我们可以借助第三方定时任务框架,例如node-schedule、cron等。 安装定时任务框架node-schedule 我们可以在项目目录下执行以下命令安装node-schedule: npm install node-schedule 编写定时推送代码 在项目代码中引入node-schedule框架,使用框架提供的scheduleJob(…

    C# 2023年6月6日
    00
  • ASP.NET:把ashx写到类库里并在页面上调用的具体方法

    将ashx写到类库( Class library )里并在页面上调用的具体方法, 可以带来代码可维护性和代码的可重用性,并且能够更好地分离底层实现和上层( Presentation layer )代码。 下面是具体的步骤: 创建 ASP.NET 类库项目 首先,我们需要做的就是创建一个 ASP.NET 类库项目。我们可以在 Visual Studio 中选择…

    C# 2023年6月3日
    00
  • 利用VS2019创建Web项目并发送到IIS及IIS与ASP.NET配置教程

    下面给你讲解如何利用VS2019创建Web项目并发送到IIS以及IIS与ASP.NET配置教程。 利用VS2019创建Web项目 打开Visual Studio 2019,选择新建项目。 在弹出的新建项目窗口的左下角选择Web,选择ASP.NET Web 应用程序,并选择.Net Framework的版本。 在新建项目窗口的中间,您可以选择Web程序类型,选…

    C# 2023年5月15日
    00
  • WinForm实现为ComboBox绑定数据源并提供下拉提示功能

    WinForm实现为ComboBox绑定数据源并提供下拉提示功能的完整攻略如下: 步骤一:定义数据源 首先需要定义一个数据源,数据源可以是数组、集合、DataTable等形式。以下是一个字符串数组作为数据源的示例代码: string[] dataSource = {"Apple", "Banana", "Ch…

    C# 2023年6月7日
    00
  • C#实现启动,关闭与查找进程的方法

    下面是详细讲解“C#实现启动,关闭与查找进程的方法”的完整攻略。 启动进程 在C#中启动一个进程,可以使用Process类的Start方法。该方法可以接受一个指向可执行文件的路径作为输入参数,并返回一个Process对象,该对象表示对该进程的控制权。 例如: using System.Diagnostics; // 启动notepad进程 Process p…

    C# 2023年5月15日
    00
  • C#把dll分别放在指定的文件夹的方法步骤

    以下是C#把dll分别放在指定文件夹的方法步骤的详细讲解。 创建两个文件夹 首先创建两个文件夹,分别用于放置需要引用的dll文件,和用于编译的exe文件。 例如,在工程目录下创建一个名为Lib的文件夹,用于放置dll文件,再创建一个名为Bin的文件夹,用于放置编译后的exe文件。 添加dll文件引用 在VS中,我们需要对需要引用的dll文件进行添加引用操作。…

    C# 2023年5月15日
    00
  • 基于数据类型转换(装箱与拆箱)与常量详解

    基于数据类型转换(装箱与拆箱)与常量详解 数据类型转换 数据类型转换是指将一种数据类型转换成另一种数据类型的过程。在Java中,数据类型可以分为两种:基本数据类型和引用数据类型。而数据类型转换又分为两种:自动类型转换和强制类型转换。 自动类型转换 自动类型转换是指将数据类型范围小的类型转换为数据类型范围大的类型的过程。在此过程中,系统会自动将数据类型范围小的…

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