- [DATABASE] Hướng dẫn tạo Procedure String Split in Mysql
- [C#] Thiết lập dấu (,) hay dấu (.) ở định dạng số đúng với định dạng số Việt Nam
- [C#] Chia sẻ source code Game Spin Lucky Wheel
- [C#] Hướng dẫn Encode and Decode HTML
- Hướng dẫn tạo tài khoản Chat Open AI GPT tại Việt Nam
- [C#] Hướng dẫn thay đổi giao diện ứng dụng Winform theo giao diện của Windows
- [VB.NET] Hiệu ứng Acrylic, Mica, Tabbed Blur Effect trên Winform
- [DEVEXPRESS] Hướng dẫn sử dụng HTML Template trên Combobox Edit
- [C#] Chia sẻ source code Orange Rain in Winform
- [DEVEXPRESS] Hướng dẫn sử dụng HTML Template trên XtraMessageBox Winform Devexpress 22.2.3
- [DEVEXPRESS] Hướng dẫn sử dụng HTML and CSS Code Viewer trên Winform
- [C#] Number Effect Counter up and down in winform
- [C#] Hướng dẫn Supend and Resume Process ID in Winform
- [C#] Hiển thị line number trên Richtextbox Winform
- [C#] Fake Blue Screen BSOD in winform
- [C#] Chia sẽ code demo sử dụng Async Parallel Foreach and For in Winform
- [C#] Sử dụng ActionBlock run X task at time winform
- [C#] Hướng dẫn sử dụng Property Grid để lưu và tải lại thông tin cấu hình user trên winform
- [C#] Hướng dẫn bắt sự kiện khi đối tượng di chuyển chạm vào object trên winform HitTest Object
- [SQLSERVER] Sử dụng GROUP BY và ROLLUP, CUBE để thống kê dữ liệu
[C#] Hướng dẫn viết ứng dụng quay màn hình video winform, Screen Recorder
Xin chào các bạn, bài viết hôm nay mình sẻ hướng dẫn các bạn cách viết một ứng dụng nhỏ quay phim màn hình Desktop trên C#, Winform.
[C#] Video Recorder Winform
Đầu tiên, các bạn cần cài đặt thư viện ScreenRecorder
từ thư viện Nuget Console:
PM> Install-Package ScreenRecorderLib -Version 3.1.1
Giao diện demo ứng dụng Recorder Screen C#:
Full source phần mềm quay phim màn hình Desktop C#:
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.IO;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
using ScreenRecorderLib;
namespace ScreenRecorder
{
public partial class Form1 : Form
{
private Timer _progressTimer;
private bool _isRecording;
private int _secondsElapsed;
Recorder _rec;
public Form1()
{
InitializeComponent();
}
private void PauseButton_Click(object sender, EventArgs e)
{
if (_rec.Status == RecorderStatus.Paused)
{
_rec.Resume();
return;
}
_rec.Pause();
}
private void RecordButton_Click(object sender, EventArgs e)
{
if (_isRecording)
{
_rec.Stop();
_progressTimer?.Stop();
_progressTimer = null;
_secondsElapsed = 0;
RecordButton.Enabled = false;
return;
}
textBoxResult.Text = "";
UpdateProgress();
string timestamp = DateTime.Now.ToString("yyyy-MM-dd HH-mm-ss");
string videoPath = Path.Combine(Path.GetTempPath(), "ScreenRecorder", timestamp, timestamp + ".mp4");
_progressTimer = new Timer();
_progressTimer.Tick += _progressTimer_Tick;
_progressTimer.Interval = 1000;
_progressTimer.Start();
_rec.Record(videoPath);
_secondsElapsed = 0;
_isRecording = true;
}
private void Rec_OnRecordingComplete(object sender, RecordingCompleteEventArgs e)
{
BeginInvoke(((Action)(() =>
{
string filePath = e.FilePath;
textBoxResult.Text = filePath;
PauseButton.Visible = false;
RecordButton.Text = "Record";
RecordButton.Enabled = true;
this.labelStatus.Text = "Completed";
_isRecording = false;
CleanupResources();
})));
}
private void Rec_OnRecordingFailed(object sender, RecordingFailedEventArgs e)
{
BeginInvoke(((Action)(() =>
{
PauseButton.Visible = false;
RecordButton.Text = "Record";
RecordButton.Enabled = true;
labelStatus.Text = "Error:";
labelError.Visible = true;
labelError.Text = e.Error;
_isRecording = false;
CleanupResources();
})));
}
private void _rec_OnStatusChanged(object sender, RecordingStatusEventArgs e)
{
BeginInvoke(((Action)(() =>
{
labelError.Visible = false;
switch (e.Status)
{
case RecorderStatus.Idle:
this.labelStatus.Text = "Idle";
break;
case RecorderStatus.Recording:
PauseButton.Visible = true;
if (_progressTimer != null)
_progressTimer.Enabled = true;
RecordButton.Text = "Stop";
PauseButton.Text = "Pause";
this.labelStatus.Text = "Recording";
break;
case RecorderStatus.Paused:
if (_progressTimer != null)
_progressTimer.Enabled = false;
PauseButton.Text = "Resume";
this.labelStatus.Text = "Paused";
break;
case RecorderStatus.Finishing:
PauseButton.Visible = false;
this.labelStatus.Text = "Finalizing video";
break;
default:
break;
}
})));
}
private void _rec_OnSnapshotSaved(object sender, SnapshotSavedEventArgs e)
{
}
private void _progressTimer_Tick(object sender, EventArgs e)
{
_secondsElapsed++;
UpdateProgress();
}
private void UpdateProgress()
{
labelTimestamp.Text = TimeSpan.FromSeconds(_secondsElapsed).ToString();
}
private void CleanupResources()
{
_progressTimer?.Stop();
_progressTimer = null;
_secondsElapsed = 0;
_rec?.Dispose();
_rec = null;
}
private void buttonOpenDirectory_Click(object sender, EventArgs e)
{
string directory = Path.Combine(Path.GetTempPath(), "ScreenRecorder");
if (!Directory.Exists(directory))
{
Directory.CreateDirectory(directory);
}
System.Diagnostics.Process.Start(directory);
}
private void buttonDeleteRecordedVideos_Click(object sender, EventArgs e)
{
try
{
Directory.Delete(Path.Combine(Path.GetTempPath(), "ScreenRecorder"), true);
MessageBox.Show("Temp files deleted");
}
catch (Exception ex)
{
MessageBox.Show("An error occured while deleting files: " + ex.Message);
}
}
private void buttonCopyPath_Click(object sender, EventArgs e)
{
if (!string.IsNullOrEmpty(textBoxResult.Text))
{
Clipboard.SetText(textBoxResult.Text);
}
}
}
}
Thanks for watching!