2010-07-20 20 views
41

Win32 का उपयोग कर वर्तमान स्क्रीन का स्क्रीनशॉट कैसे ले सकता हूं?मैं विंडोज़ एप्लिकेशन में स्क्रीनशॉट कैसे ले सकता हूं?

+2

स्क्रीन पर कब्जा करने के लिए http://www.codeproject.com/Articles/5051/Various-methods-for-capturing-the-screen – hB0

+1

यहाँ मेरी compilable सार है विभिन्न तरीकों /gist.github.com/rdp/9821698 – rogerdpack

उत्तर

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

यह विंडोज एनटी 4 से विंडोज 7 तक सभी एनटी आधारित विंडोज़ पर काम करता है। – Woody

+6

आप CreateDC का उपयोग क्यों कर रहे हैं न कि केवल GetDC (NULL)? – Anders

+0

ईमानदारी से मैंने इसे थोड़ी देर तक नहीं देखा है, यह एक ऐसे तरीके से कोड है जिसे मैं किसी एप्लिकेशन में उपयोग कर रहा हूं। यह सबकुछ में काम करता है इसलिए मैं कभी वापस नहीं गया! यदि गेटडीसी बेहतर होगा, तो मैं जवाब को बढ़ा सकता हूं। – Woody

3

एक एमएसडीएन नमूना, Capturing an Image है, एक डीसी को मनमानी एचडब्ल्यूएनडी कैप्चर करने के लिए (आप आउटपुट को GetDesktopWindow से पास करने का प्रयास कर सकते हैं)। लेकिन Vista/Windows 7 पर नए डेस्कटॉप कंपोजिटर के तहत यह कितना अच्छा काम करेगा, मुझे नहीं पता।

24
  1. संपूर्ण स्क्रीन के लिए डीसी प्राप्त करने के लिए GetDC(NULL); का उपयोग करें।
  2. संगत डीसी प्राप्त करने के लिए CreateCompatibleDC का उपयोग करें।
  3. परिणाम रखने के लिए बिटमैप बनाने के लिए CreateCompatibleBitmap का उपयोग करें।
  4. संगत डीसी में बिटमैप का चयन करने के लिए SelectObject का उपयोग करें।
  5. स्क्रीन डीसी से संगत डीसी में कॉपी करने के लिए BitBlt का उपयोग करें।
  6. संगत डीसी से बिटमैप को अचयनित करें।

जब आप संगत बिटमैप बनाते हैं, तो आप स्क्रीन डीसी के साथ संगत चाहते हैं, संगत डीसी नहीं। https::/

+1

दोहरी डिस्प्ले सिस्टम के बारे में क्या? दोनों स्क्रीन का शॉट? – 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); 
} 
संबंधित मुद्दे

 संबंधित मुद्दे