Làm cách nào để chụp ảnh màn hình hiện tại bằng Win32?Làm cách nào để chụp ảnh màn hình trong ứng dụng cửa sổ?
Trả lời
// get the device context of the screen
HDC hScreenDC = CreateDC("DISPLAY", NULL, NULL, NULL);
// and a device context to put it in
HDC hMemoryDC = CreateCompatibleDC(hScreenDC);
int width = GetDeviceCaps(hScreenDC, HORZRES);
int height = GetDeviceCaps(hScreenDC, VERTRES);
// maybe worth checking these are positive values
HBITMAP hBitmap = CreateCompatibleBitmap(hScreenDC, width, height);
// get a new bitmap
HBITMAP hOldBitmap = (HBITMAP) SelectObject(hMemoryDC, hBitmap);
BitBlt(hMemoryDC, 0, 0, width, height, hScreenDC, 0, 0, SRCCOPY);
hBitmap = (HBITMAP) SelectObject(hMemoryDC, hOldBitmap);
// clean up
DeleteDC(hMemoryDC);
DeleteDC(hScreenDC);
// now your image is held in hBitmap. You can save it or do whatever with it
Điều này hoạt động trên tất cả các cửa sổ dựa trên nt từ Windows NT4 đến Windows 7. – Woody
Tại sao bạn sử dụng CreateDC và không chỉ GetDC (NULL)? – Anders
Thành thực mà nói, tôi đã không xem xét nó trong một thời gian, đây là mã từ khá một cách mà tôi đã sử dụng trong một ứng dụng. Nó hoạt động trong mọi thứ vì vậy tôi chưa bao giờ quay lại với nó! Nếu GetDC tốt hơn, tôi có thể thêm vào câu trả lời. – Woody
Có mẫu MSDN, Capturing an Image, để chụp HWND tùy ý cho DC (bạn có thể thử chuyển đầu ra từ GetDesktopWindow đến đây). Nhưng làm thế nào tốt này sẽ làm việc theo compositor máy tính để bàn mới trên Vista/Windows 7, tôi không biết.
- Sử dụng
GetDC(NULL);
để nhận DC cho toàn bộ màn hình. - Sử dụng
CreateCompatibleDC
để nhận DC tương thích. - Sử dụng
CreateCompatibleBitmap
để tạo bitmap để giữ kết quả. - Sử dụng
SelectObject
để chọn bitmap vào DC tương thích. - Sử dụng
BitBlt
để sao chép từ màn hình DC sang DC tương thích. - Bỏ chọn bitmap từ DC tương thích.
Khi bạn tạo bitmap tương thích, bạn muốn nó tương thích với màn hình DC, không tương thích với DC.
Điều gì về hệ thống hiển thị kép? Shot của cả hai màn hình? – i486
void GetScreenShot(void)
{
int x1, y1, x2, y2, w, h;
// get screen dimensions
x1 = GetSystemMetrics(SM_XVIRTUALSCREEN);
y1 = GetSystemMetrics(SM_YVIRTUALSCREEN);
x2 = GetSystemMetrics(SM_CXVIRTUALSCREEN);
y2 = GetSystemMetrics(SM_CYVIRTUALSCREEN);
w = x2 - x1;
h = y2 - y1;
// copy screen to bitmap
HDC hScreen = GetDC(NULL);
HDC hDC = CreateCompatibleDC(hScreen);
HBITMAP hBitmap = CreateCompatibleBitmap(hScreen, w, h);
HGDIOBJ old_obj = SelectObject(hDC, hBitmap);
BOOL bRet = BitBlt(hDC, 0, 0, w, h, hScreen, x1, y1, SRCCOPY);
// save bitmap to clipboard
OpenClipboard(NULL);
EmptyClipboard();
SetClipboardData(CF_BITMAP, hBitmap);
CloseClipboard();
// clean up
SelectObject(hDC, old_obj);
DeleteDC(hDC);
ReleaseDC(NULL, hScreen);
DeleteObject(hBitmap);
}
phương pháp khác nhau để chụp màn hình http://www.codeproject.com/Articles/5051/Various-methods-for-capturing-the-screen – hB0
Dưới đây là ý chính compilable tôi: https://gist.github.com/rdp/9821698 – rogerdpack