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日

相关文章

  • 什么是JWT超详细讲解

    以下是关于“什么是JWT超详细讲解”的完整攻略: 1. 什么是JWT? JWT(JSON Web Token)是一种用于身份验证开放标准(RFC 7519),它定义了一种紧凑且包含的方式,用于在各方之间安全地传输信息。JWT通常用于Web应用程序中,以验证用户的身份并提供访问控制。 2. JWT的结构 JWT由三部分组成,它们用点号(.)分隔开来: head…

    C# 2023年5月12日
    00
  • C# SendKeys使用方法介绍

    C#中的SendKeys提供了一种模拟按键的方法。它可以被用于许多场合,例如在自动化测试中,或者模拟用户输入等方面。下面是该方法的使用方法介绍: SendKeys方法 public static void SendKeys(string keys); SendKeys方法可以将一系列符号或字符串发送到当前活动窗口。 参数 keys:要发送的符号或字符串。 示…

    C# 2023年6月7日
    00
  • C#实现绘制随机噪点和直线

    请看下面: C#实现绘制随机噪点和直线 第一步:创建窗体和画布 首先,在Visual Studio的菜单栏中选择:File -> New -> Project,在弹出的窗口中选择:Windows Forms App(.NET Framework),取一个有意义的名称,然后点击创建按钮。 接下来,在弹出的窗口中选择:Form,创建一个窗体。然后在窗…

    C# 2023年6月6日
    00
  • C#多线程编程中的锁系统(三)

    当多个线程同时访问共享资源时,可能会导致数据的不一致性,从而影响程序的正确性和稳定性。为了解决这个问题,我们可以使用锁系统来保证共享资源在同一时刻只能被一个线程访问和修改。 在C#多线程编程中,锁系统通常使用lock关键字来实现。下面是使用lock关键字来实现的示例代码: public class Counter { private static objec…

    C# 2023年6月7日
    00
  • C#自定义基于控制台的Timer实例

    下面就为大家详细讲解如何自定义基于控制台的Timer实例。 准备工作 在使用C#自定义基于控制台的Timer实例之前,我们需要先在命名空间中引用System.Threading命名空间。 using System.Threading; 接着我们需要定义Timer对象和定时器事件处理程序,代码如下: //定义Timer对象 Timer timer = null…

    C# 2023年6月1日
    00
  • C#静态static的用法实例分析

    C#静态static的用法实例分析 什么是C#静态static C#中可以使用static关键字来表示静态成员。所谓静态成员,就是可以在不实例化类的情况下访问的成员。静态成员可以是属性、方法、字段等。 public class MyClass { public static int MyStaticProperty { get; set; } public …

    C# 2023年5月31日
    00
  • C#栈和队列的简介,算法与应用简单实例

    C#栈和队列的简介 什么是栈和队列? 栈(Stack)和队列(Queue)是两种常用的数据结构,它们都是线性数据结构。 栈就像是一个箱子,我们往箱子里放入物品(压栈),并取出箱子里面的物品(弹栈)。 队列就像是一条排队的队伍,我们往队伍的尾部加入一个人(入队),并从队伍的头部取出一个人(出队)。 算法 栈(Stack) 1.入栈(Push):将一个元素加入栈…

    C# 2023年5月31日
    00
  • .Net Core内存回收模式及性能测试对比分析

    .NET Core内存回收模式及性能测试对比分析 .NET Core是一个跨平台的开源框架,它提供了多种内存回收模式,以满足不同应用程序的需求。本攻略将详细介绍.NET Core内存回收模式的概念、用法和性能测试对比分析。 什么是内存回收模式? 内存回收模式是一种.NET Core运行时的配置选项,它控制着垃圾回收器的行为。垃圾回收器是.NET Core运行…

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