2010-07-20 37 views

Trả lời

49
// 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 
+0

Đ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

+6

Tại sao bạn sử dụng CreateDC và không chỉ GetDC (NULL)? – Anders

+0

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

3

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.

24
  1. Sử dụng GetDC(NULL); để nhận DC cho toàn bộ màn hình.
  2. Sử dụng CreateCompatibleDC để nhận DC tương thích.
  3. Sử dụng CreateCompatibleBitmap để tạo bitmap để giữ kết quả.
  4. Sử dụng SelectObject để chọn bitmap vào DC tương thích.
  5. Sử dụng BitBlt để sao chép từ màn hình DC sang DC tương thích.
  6. 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.

+1

Điều gì về hệ thống hiển thị kép? Shot của cả hai màn hình? – i486

23
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); 
} 
Các vấn đề liên quan