C# 编程技巧实现屏幕录制功能

前言

在许多应用场景中,屏幕录制是一项非常有用的功能。

不管是用于教学、演示、故障排查还是游戏录制,能够方便快捷地记录屏幕上的活动都是非常有价值的。

本文将详细介绍如何使用 C# 实现屏幕录制功能,帮助大家快速掌握这一实用技能。

环境准备

在开始之前,请确保您已经安装了以下软件:

1、Visual Studio

用于 C# 开发的集成开发环境。

2、FFmpeg

下载并解压 FFmpeg,记录下其可执行文件的路径。

创建 C# 程序

1、创建项目

打开 Visual Studio,新建一个 Windows Forms 应用程序项目,命名为 AppRecordScreen

2、添加控件

在窗口中添加两个按钮,分别用于"开始录制"和"停止录制"。

录屏代码

接下来,需要编写录屏的核心代码。

以下是实现屏幕录制的完整代码:

cs 复制代码
using System.Diagnostics;

namespace AppRecordScreen
{
    public partial class Form1 : Form
    {
        // 录屏相关变量  
        privatebool isRecording = false;
        private Process ffmpegProcess;
        privatestring outputVideoPath;
        // FFmpeg可执行文件的完整路径  
        privatestring ffmpegPath = 
        @"D:\Software\ffmpeg-master-latest-win64-gpl-shared
        \bin\ffmpeg.exe"; 
        public Form1()
        {
            InitializeComponent();
        }

        private async void btnStart_Click(object sender, EventArgs e)
        {
            if (!isRecording)
            {
                StartRecording();
            }
        }

        private void btnStop_Click(object sender, EventArgs e)
        {
            if (isRecording)
            {
                StopRecording();
            }
        }
        /// <summary>  
        /// 开始录制屏幕  
        /// </summary>  
        private void StartRecording()
        {
            // 生成唯一的视频文件名  
            outputVideoPath = Path.Combine(
                Environment.GetFolderPath(Environment.SpecialFolder.Desktop),
                $"ScreenRecord_
                {DateTime.Now:yyyyMMdd_HHmmss}.mp4"
            );

            try
            {
                // 使用FFmpeg进行屏幕录制  
                ffmpegProcess = new Process
                {
                    StartInfo = new ProcessStartInfo
                    {
                        // 使用完整路径  
                        FileName = ffmpegPath,
                        Arguments = $"-f gdigrab -framerate 30 -i desktop 
                        -c:v libx264 -preset ultrafast {outputVideoPath}",
                        UseShellExecute = false,
                        RedirectStandardInput = true,
                        CreateNoWindow = true
                    }
                };

                ffmpegProcess.Start();
                isRecording = true;

                MessageBox.Show("录制已开始", "提示", 
                MessageBoxButtons.OK, MessageBoxIcon.Information);
            }
            catch (Exception ex)
            {
                MessageBox.Show($"启动录制失败:{ex.Message}", "错误", MessageBoxButtons.OK, MessageBoxIcon.Error);
            }
        }

        /// <summary>  
        /// 停止录制屏幕  
        /// </summary>  
        private void StopRecording()
        {
            try
            {
                // 发送 'q' 命令给 FFmpeg 进程以正常结束录制  
                ffmpegProcess.StandardInput.WriteLine("q");
                ffmpegProcess.WaitForExit();

                isRecording = false;

                MessageBox.Show($"录制已完成。视频保存在:{outputVideoPath}", "提示", 
                MessageBoxButtons.OK, MessageBoxIcon.Information);
            }
            catch (Exception ex)
            {
                MessageBox.Show($"停止录制失败:{ex.Message}", "错误", MessageBoxButtons.OK, MessageBoxIcon.Error);
            }
        }

        // 在关闭窗体时确保停止录制  
        protected override void OnFormClosing(FormClosingEventArgs e)
        {
            if (isRecording)
            {
                StopRecording();
            }
        }
    }
}

代码解释

变量定义

主要定义了录屏相关的变量,包括录制状态、FFmpeg 进程、输出视频路径和 FFmpeg 的可执行文件路径。

开始录制

当用户点击"开始录制"按钮时,StartRecording 方法将被调用,生成一个带有时间戳的唯一视频文件名,并启动 FFmpeg 进程进行屏幕录制。

停止录制

用户点击"停止录制"按钮时,StopRecording 方法会发送结束命令给 FFmpeg 进程,停止录制并保存视频。

关闭窗体

在窗体关闭时,如果正在录制,会自动停止录制,确保视频完整保存。

总结

通过本文的学习掌握如何使用 C# 实现屏幕录制功能,并能够根据实际需求进行扩展和优化。还可以在此基础上不断扩展功能,例如添加视频格式选择、录音功能等。

希望能通过这篇文章大家能够快速上手并开发自己的屏幕录制工具。

最后

如果你觉得这篇文章对你有帮助,不妨点个赞支持一下!你的支持是我继续分享知识的动力。如果有任何疑问或需要进一步的帮助,欢迎随时留言。

也可以加入微信公众号 [DotNet技术匠] 社区,与其他热爱技术的同行一起交流心得,共同成长!

优秀是一种习惯,欢迎大家留言学习!

作者:技术老小子

出处:mp.weixin.qq.com/s/jhjPVMDnCGlah1M61E2wsg

声明:网络内容,仅供学习,尊重版权,侵权速删,歉意致谢!

相关推荐
编程轨迹2 分钟前
深入理解 Java 中的信号机制
后端
夕颜1116 分钟前
让 cursor 教我用 cursor 的隐藏技能
后端·trae
橘子青衫14 分钟前
Java并发编程利器:CyclicBarrier与CountDownLatch解析
java·后端·性能优化
编程轨迹16 分钟前
如何在 Java 中整合 HTML 文档
后端
编程轨迹16 分钟前
如何在 Java 中将 XLS 转换为 XLSX
后端
天天摸鱼的java工程师26 分钟前
高考放榜夜,系统别崩!聊聊查分系统怎么设计,三张表足以?
java·后端·mysql
天天摸鱼的java工程师34 分钟前
深入理解 Spring 核心:IOC 与 AOP 的原理与实践
java·后端
编程轨迹1 小时前
使用 Playwright Java 框架创建自定义的请求和响应日志记录器
后端
Moonbit1 小时前
征文开启|写一篇能跑的文档,赢 MoonBit 周边 & 成为官方示例
后端
我爱Jack1 小时前
Spring Boot统一功能处理深度解析
java·spring boot·后端