Việc chụp lại màn hình làm việc hiện tại thường được thực hiện bằng cách sử dụng phím Print Screen. Ảnh sau khi chụp sẽ được lưu vào bộ nhớ và phải dùng Paint hay tương tự để lưu lại bức ảnh vừa chụp. Khi công việc yêu cầu phải chụp màn hình lại nhiều lần như viết tài liệu mô tả, việc lặp đi lặp lại các thao tác này sẽ tốn nhiều công sức.
Bài viết hướng dẫn cách xây dựng một ứng dụng bằng C# giúp chụp ảnh màn hình và lưu lại tức thì chỉ trong 5 bước.
Xây dựng ứng dụng
Khởi đầu với việc tạo một project C# trống, loại ứng dụng là Console và đặt tên STDIO_ScreenCapture.
Project sau khi khởi tạo có nội dung như sau.
Bước 1: Khai báo đối tượng Bitmap và Graphic
Mặc định, project được tạo dưới dạng Console Application sẽ không tham chiếu đến thư viện System.Drawing. Do đó, chương trình sẽ báo lỗi nếu đối tượng Bitmap được thêm vào.
Để khắc phục vấn đề này, tại cửa sổ Solution Explorer
- Click phải vào References > Add Reference …
- Tại mục Framework, trong danh sách các thư viện khả dụng, tick chọn System.Drawing
- Chọn OK để hoàn tất việc thêm thư viện tham chiếu.
Sau đó, khai báo với chương trình sẽ sử dụng thư viện System.Drawing
using System.Drawing;
Và khai báo 2 đối tượng Bitmap
, Graphics
trong lớp Program
private static Bitmap screenBitmap; private static Graphics screenGraphics;
Bước 2: Tạo hộp thoại xác nhận việc lưu ảnh
Hộp thoại sử dụng trong trường hợp này là SaveFileDialog
thuộc thư viện System.Windows.Forms và cần được tham chiếu tương tự như thư viện System.Drawing.
Trong hàm main
, tiến hành tạo đối tượng dialog và hiển thị. Hộp thoại này sẽ trả về kiểu DialogResult
và chỉ xử lý nếu người dùng chọn OK.
SaveFileDialog saveDialog = new SaveFileDialog(); // Set filter options and filter index. saveDialog.Filter = "PNG Files (.png)|*.png|All Files (*.*)|*.*"; saveDialog.FilterIndex = 1; if (saveDialog.ShowDialog() == DialogResult.OK) { }
Biên dịch và chạy thử chương trình, hộp thoại save hiện lên như hình bên dưới
Nếu chương trình kết thúc với lỗi ThreadStateException
thì cần thêm chỉ dẫn [STAThread]
ngay trước hàm main.
[STAThread] static void Main(string[] args)
Bước 3: Khởi tạo đối tượng Bitmap và Graphics
Các đối tượng này được khởi tạo khi và chỉ khi người dùng chọn đồng ý lưu file. Đối tượng Bitmap
được tạo ra có kích thước bằng với kích thước màn hình hiện hành.
screenBitmap = new Bitmap(Screen.PrimaryScreen.Bounds.Width, Screen.PrimaryScreen.Bounds.Height, PixelFormat.Format32bppArgb); screenGraphics = Graphics.FromImage(screenBitmap);
Bước 4: Lưu ảnh màn hình vào đối tượng Bitmap
Thao tác này được thực hiện như sau:
screenGraphics.CopyFromScreen(Screen.PrimaryScreen.Bounds.X, Screen.PrimaryScreen.Bounds.Y, 0, 0, Screen.PrimaryScreen.Bounds.Size, CopyPixelOperation.SourceCopy);
Bước 5: Xuất nội dung được lưu ra file
Từ đối tượng Bitmap, gọi phương thức Save với 2 tham số:
filename
: đường dẫn lưu file, có thể lấy thông qua đối tượngSaveFileDialog
format
: định dạng ảnh muốn lưu, ví dụ: PNG
screenBitmap.Save(saveDialog.FileName, ImageFormat.Png);
Code hoàn chỉnh của chương trình:
using System; using System.Drawing; using System.Drawing.Imaging; using System.Threading.Tasks; using System.Windows.Forms; namespace STDIO_ScreenCapture { class Program { private static Bitmap screenBitmap; private static Graphics screenGraphics; [STAThread] static void Main(string[] args) { SaveFileDialog saveDialog = new SaveFileDialog(); // Set filter options and filter index. saveDialog.Filter = "PNG Files (.png)|*.png|All Files (*.*)|*.*"; saveDialog.FilterIndex = 1; if (saveDialog.ShowDialog() == DialogResult.OK) { screenBitmap = new Bitmap(Screen.PrimaryScreen.Bounds.Width, Screen.PrimaryScreen.Bounds.Height, PixelFormat.Format32bppArgb); screenGraphics = Graphics.FromImage(screenBitmap); screenGraphics.CopyFromScreen(Screen.PrimaryScreen.Bounds.X, Screen.PrimaryScreen.Bounds.Y, 0, 0, Screen.PrimaryScreen.Bounds.Size, CopyPixelOperation.SourceCopy); screenBitmap.Save(saveDialog.FileName, ImageFormat.Png); } } } }
Khả năng mở rộng
Ứng dụng có thể được viết lại như một dịch vụ chạy ngầm và thao tác chụp ảnh màn hình chỉ được kích hoạt khi một tổ hợp phím được nhấn. Ngoài ra, tích hợp cơ chế đánh tên ảnh tự động ví dụ như ss_1.png, ss_2.png … và cho chọn nơi lưu toàn bộ các screenshot này.
Download ứng dụng mẫu
Yêu cầu hệ thống:
- Windows 8.1 Pro (64-bit)
- Visual Studio 2013 Community
- .NET Framework 4.5.
Download: STDIO_ScreenCapture_VS2013.zip