Win32 का उपयोग कर वर्तमान स्क्रीन का स्क्रीनशॉट कैसे ले सकता हूं?मैं विंडोज़ एप्लिकेशन में स्क्रीनशॉट कैसे ले सकता हूं?
उत्तर
// 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
यह विंडोज एनटी 4 से विंडोज 7 तक सभी एनटी आधारित विंडोज़ पर काम करता है। – Woody
आप CreateDC का उपयोग क्यों कर रहे हैं न कि केवल GetDC (NULL)? – Anders
ईमानदारी से मैंने इसे थोड़ी देर तक नहीं देखा है, यह एक ऐसे तरीके से कोड है जिसे मैं किसी एप्लिकेशन में उपयोग कर रहा हूं। यह सबकुछ में काम करता है इसलिए मैं कभी वापस नहीं गया! यदि गेटडीसी बेहतर होगा, तो मैं जवाब को बढ़ा सकता हूं। – Woody
एक एमएसडीएन नमूना, Capturing an Image है, एक डीसी को मनमानी एचडब्ल्यूएनडी कैप्चर करने के लिए (आप आउटपुट को GetDesktopWindow से पास करने का प्रयास कर सकते हैं)। लेकिन Vista/Windows 7 पर नए डेस्कटॉप कंपोजिटर के तहत यह कितना अच्छा काम करेगा, मुझे नहीं पता।
- संपूर्ण स्क्रीन के लिए डीसी प्राप्त करने के लिए
GetDC(NULL);
का उपयोग करें। - संगत डीसी प्राप्त करने के लिए
CreateCompatibleDC
का उपयोग करें। - परिणाम रखने के लिए बिटमैप बनाने के लिए
CreateCompatibleBitmap
का उपयोग करें। - संगत डीसी में बिटमैप का चयन करने के लिए
SelectObject
का उपयोग करें। - स्क्रीन डीसी से संगत डीसी में कॉपी करने के लिए
BitBlt
का उपयोग करें। - संगत डीसी से बिटमैप को अचयनित करें।
जब आप संगत बिटमैप बनाते हैं, तो आप स्क्रीन डीसी के साथ संगत चाहते हैं, संगत डीसी नहीं। https::/
दोहरी डिस्प्ले सिस्टम के बारे में क्या? दोनों स्क्रीन का शॉट? – 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);
}
स्क्रीन पर कब्जा करने के लिए http://www.codeproject.com/Articles/5051/Various-methods-for-capturing-the-screen – hB0
यहाँ मेरी compilable सार है विभिन्न तरीकों /gist.github.com/rdp/9821698 – rogerdpack