2011-11-24 94 views
0

是否有可能通过C编程截取桌面并将其保存为.jpg,jpeg,...在计算机中的任何位置?我很想知道是否有任何方法和方法来完成这项任务。我正在使用Windows XP。用C程序截取Windows桌面。

+2

有很多可用的屏幕截图程序,适用于所有平台。如果你想写自己为什么不看他们,他们做什么? –

+0

@JoachimPileborg:当我搜索时,我使用软件代替代码,所以你可以建议一些链接,它有C,C++,Java,c#中的示例代码。 –

+1

我认为这取决于操作系统。你使用哪个操作系统? – duedl0r

回答

1

假设的Visual Studio:
这是工作的代码复制粘贴&(一些行中省略):

HDC  hdcScreen = NULL; 
HDC  hdcMemDC = NULL; 
HBITMAP  hbmScreen = NULL; 

CImage  myimage; 
IStream* pIStream = NULL; 
STATSTG  stg; 
HGLOBAL  hGlobal  = NULL; 
HRESULT  hResult  = 0; 

UINT  nDataSize = 0; 

do 
{ 
    // 
    // Get the screen capture in an HBITMAP. 
    // ------------------------------------- 
    // Retrieve the handle to a display device context for the client 
    // area of the window. 
    hdcScreen = ::GetDC(NULL); 
    if (hdcScreen == NULL) 
    { 
     SET_CHECKPOINT(); 
     break; 
    } 

    // Create a compatible DC which is used in a BitBlt from the window DC 
    hdcMemDC = CreateCompatibleDC(hdcScreen); 
    if (hdcMemDC == NULL) 
    { 
     SET_CHECKPOINT(); 
     break; 
    } 

    // Get the client area for size calculation 
    int cx = GetSystemMetrics(SM_CXSCREEN); 
    int cy = GetSystemMetrics(SM_CYSCREEN); 

    // Create a compatible bitmap from the Window DC 
    hbmScreen = CreateCompatibleBitmap(hdcScreen, cx, cy); 
    if (hbmScreen == NULL) 
    { 
     SET_CHECKPOINT(); 
     break; 
    } 

    // Select the compatible bitmap into the compatible memory DC. 
    SelectObject(hdcMemDC,hbmScreen); 

    // Bit block transfer into our compatible memory DC. 
    BitBlt(hdcMemDC, 0,0, cx, cy, hdcScreen, 0,0, SRCCOPY); 

    // Create a stream to have CImage write data to. 
    hResult = CreateStreamOnHGlobal(NULL, TRUE, &pIStream); 
    if (hResult != S_OK) 
    { 
     SET_CHECKPOINT(); 
     break; 
    } 

    // Attach an ATL CImage to the hbitmap. 
    myimage.Attach(hbmScreen); 

    // Write data to stream. 
    hResult = myimage.Save(pIStream, Gdiplus::ImageFormatJPEG); 
    if (hResult != S_OK) 
    { 
     SET_CHECKPOINT(); 
     break; 
    } 
    myimage.Detach(); 

    // Get the stream's HGLOBAL. 
    hResult = GetHGlobalFromStream(pIStream, &hGlobal); 
    if (hResult != S_OK) 
    { 
     SET_CHECKPOINT(); 
     break; 
    } 

    // Get a pointer to the data in the HGLOBAL. 
    char* pJPGData = (char*)GlobalLock(hGlobal); 
    pIStream->Stat(&stg, STATFLAG_NONAME); 
    nDataSize = (UINT)stg.cbSize.QuadPart; 

    // TODO: Open a file instead of a pipe... 

    //pJPGData points to the data, nDataSize is, well... 
    if (WriteFile(hFile, pJPGData, nDataSize, &dwBytesWritten, NULL) == FALSE) 
    { 
     SET_CHECKPOINT(); 
     break; 
    } 

    // TODO: Close the file. 
} 
while (0,0); 

// 
// Free resources. 
// --------------- 
if (pIStream != NULL)     pIStream->Release(); 

//Clean up 
if (hbmScreen) DeleteObject(hbmScreen); 
if (hdcMemDC ) DeleteObject(hdcMemDC); 
if (hdcScreen) ::ReleaseDC(NULL,hdcScreen); 
+0

#include那些: