Có vài cách chụp ảnh màn hình bằng C# nhưng bài viết này chỉ giới thiệu cách duy nhất nhanh & hiệu quả.
Sử dụng thư viện User32.dll và GDI32.dll chụp ảnh bạn cần import DLL, kết quả trả về là bitmap với kích thước màn hình.
Bài viết này hướng dẫn 2 cách chụp: chụp full màn hình hoặc chụp hình từ 1 chương trình (process).
Cách 1: chụp full màn hình
Bước 1: tạo mới dự án Windows Form application bằng .NET framework
Bước 2: thêm 1 button để chụp ảnh và 1 picture box để hiển thị ảnh. Picturebox chọn Size Mode là Zoom
Bước 3: Import các function của User32.dll và GDI32.dll. Đây là các DLL có sẵn của hệ điều hành Windows, viết bằng C/C++ nên các bạn cần import vào class trước khi sử dụng
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 |
[DllImport("User32.dll")] public static extern int GetDesktopWindow(); [DllImport("User32.dll")] public static extern int GetWindowDC(int hWnd); [DllImport("User32.dll")] public static extern int ReleaseDC(int hWnd, int hDC); [DllImport("GDI32.dll")] public static extern bool BitBlt(int hdcDest, int nXDest, int nYDest, int nWidth, int nHeight, int hdcSrc, int nXSrc, int nYSrc, int dwRop); [DllImport("GDI32.dll")] public static extern int CreateCompatibleBitmap(int hdc, int nWidth, int nHeight); [DllImport("GDI32.dll")] public static extern int CreateCompatibleDC(int hdc); [DllImport("GDI32.dll")] public static extern bool DeleteDC(int hdc); [DllImport("GDI32.dll")] public static extern bool DeleteObject(int hObject); [DllImport("GDI32.dll")] public static extern int GetDeviceCaps(int hdc, int nIndex); [DllImport("GDI32.dll")] public static extern int SelectObject(int hdc, int hgdiobj); |
Bước 4: tạo sự kiện click button để gọi hàm TakeScreenshot(), sau đó hiển thị lên picture box
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 |
public static Bitmap TakeScreenshot() { int hdcSrc = GetWindowDC(GetDesktopWindow()), // Get a handle to the desktop window hdcDest = CreateCompatibleDC(hdcSrc), // Create a memory device context hBitmap = CreateCompatibleBitmap(hdcSrc, // Create a bitmap and place it in the memory DC GetDeviceCaps(hdcSrc, 8), GetDeviceCaps(hdcSrc, 10)); // GDI32.GetDeviceCaps(hdcSrc,8) returns the width of the desktop window // GDI32.GetDeviceCaps(hdcSrc,10) returns the height of the desktop window SelectObject(hdcDest, hBitmap); // Required to create a color bitmap BitBlt(hdcDest, 0, 0, GetDeviceCaps(hdcSrc, 8), // Copy the on-screen image into the memory DC GetDeviceCaps(hdcSrc, 10), hdcSrc, 0, 0, 0x00CC0020); Bitmap image = new Bitmap(Image.FromHbitmap(new IntPtr(hBitmap)), Image.FromHbitmap(new IntPtr(hBitmap)).Width, Image.FromHbitmap(new IntPtr(hBitmap)).Height); //SaveImageAs(hBitmap, fileName, imageFormat); // Save the screen-capture to the specified file using the designated image format // Release the device context resources back to the system ReleaseDC(GetDesktopWindow(), hdcSrc); DeleteDC(hdcDest); DeleteObject(hBitmap); return image; } |
Cách 2: chụp từ 1 chương trình
Để chụp cửa sổ của chương trình ví dụ như Chrome thì cửa sổ đó phải on top và phải xác định được process name. Mở Task manager lên, tìm process muốn chụp ảnh, ấn chuột phải chọn Open File Location.
Các bạn sẽ thấy tên process là chrome (bỏ exe)
Code chụp ảnh như bên dưới, đoạn code này sẽ tìm process, nếu tìm thấy sẽ chụp ảnh và lưu thành file screenshot.png
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 |
public void CaptureApplication(string procName) { var processes = Process.GetProcessesByName(procName); if (processes.Length == 0) return; for(int i=0; i<processes.Length;i++) { var process = processes[i]; var rect = new User32.Rect(); User32.GetWindowRect(process.MainWindowHandle, ref rect); int width = rect.right - rect.left; int height = rect.bottom - rect.top; if (width == 0 || height == 0) continue; var bmp = new Bitmap(width, height, PixelFormat.Format32bppArgb); using (Graphics graphics = Graphics.FromImage(bmp)) { graphics.CopyFromScreen(rect.left, rect.top, 0, 0, new Size(width, height), CopyPixelOperation.SourceCopy); } bmp.Save("screenshot.png", ImageFormat.Png); break; } } private class User32 { [StructLayout(LayoutKind.Sequential)] public struct Rect { public int left; public int top; public int right; public int bottom; } [DllImport("user32.dll")] public static extern IntPtr GetWindowRect(IntPtr hWnd, ref Rect rect); } |
Cách gọi hàm
CaptureApplication("chrome");
Download source code
https://github.com/thigiacmaytinh/TGMTcs/tree/main/3.1_TakeScreenshot