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日

相关文章

  • Linq利用Distinct去除重复项问题(可自己指定)

    Linq利用Distinct去除重复项问题(可自己指定) 在Linq中,我们可以使用Distinct方法来去除重复项。但是默认情况下,Distinct方法只能去除基本数据类型的重复项,在处理对象时会遇到一些问题。下面我们来详细讲解如何使用Linq的Distinct方法去除重复项,同时解决对象去重的问题。 1. 基本类型的Distinct去重 对于基本数据类型…

    C# 2023年6月1日
    00
  • 基于WPF编写一个串口转UDP工具

    下面是详细的攻略: 1. 准备工作 首先你需要准备一台装有.NET Framework和WPF开发工具的计算机。然后安装System.IO.Ports和System.Net.Sockets命名空间。 2. 创建WPF应用程序 使用Visual Studio打开一个新的WPF应用程序。然后在MainWindow.xaml中创建一个界面布局,包含按钮、输入框、输…

    C# 2023年6月6日
    00
  • C# 分支与循环介绍

    C#分支与循环介绍 在C#中,分支与循环结构是编写程序中十分常见的语法,能够实现程序流程控制,对于实现各种业务逻辑非常重要。本文将详细介绍C#中分支与循环的使用方法。 分支结构 C#中的分支结构主要包括 if/else 语句和 switch 语句。 if/else 语句 if/else 语句是一种基本的条件判断结构,通过判断指定的条件是否满足来决定程序执行的…

    C# 2023年5月15日
    00
  • asp.net core中灵活的配置方式详解

    ASP.NET Core中灵活的配置方式详解 ASP.NET Core提供了多种配置方式,以便开发人员可以根据应用程序的需要选择最适合的配置方式。本文将介绍ASP.NET Core中的灵活配置方式,包括: appsettings.json文件 环境变量 命令行参数 用户机密存储 1. appsettings.json文件 appsettings.json文件…

    C# 2023年5月16日
    00
  • ASP 处理JSON数据的实现代码

    ASP(Active Server Pages)是类似于PHP的一种动态服务器端脚本语言,在ASP中实现JSON数据处理需要使用到一些相关的类库。 处理JSON数据的基本流程如下: 客户端通过HTTP请求将JSON数据发送到服务器端 服务器端的ASP代码接收JSON数据,并通过相关类库解析JSON数据成为一个可操作的对象 服务器端的ASP代码对解析后的JSO…

    C# 2023年5月31日
    00
  • C#中通过使用Connection类来实现打开/关闭数据库的代码实例

    我们来讲解一下C#中打开关闭数据库的代码实例。 首先,C#中打开关闭数据库需要使用到System.Data.SqlClient命名空间中的一些类,包括SqlConnection、SqlCommand、SqlDataAdapter、SqlDataReader等,而打开/关闭数据库的核心是SqlConnection类。 打开数据库 要打开数据库,我们需要创建一个…

    C# 2023年5月15日
    00
  • C# 扩展方法小结

    非常感谢您对C#扩展方法的关注。以下是关于C#扩展方法的完整攻略。 什么是C#扩展方法 C#扩展方法允许程序员向现有类型添加方法,而不必创建新类来继承该类型。扩展方法是一种特殊的静态方法,它在使用时看起来就像在本地类中定义的方法一样。扩展方法可以显式地指定扩展方法所要扩展的类型,也可以扩展任何类型的对象。 C#扩展方法可以让代码变得更加简洁、易读,也可以在某…

    C# 2023年5月15日
    00
  • Idea自动生成Entity实现过程详解

    Idea自动生成Entity实现过程详解 在Idea开发环境中,可以使用一些插件或功能自动生成Entity类。下面是详细的实现过程: 1. 安装Lombok插件 Lombok是一款Java的轻量级插件,在Idea中使用可以省略很多冗余的代码。在Idea插件库中安装Lombok插件,安装完成后需要重启Idea。 2. 使用注解生成Entity 使用Lombok…

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