0
是否有可能通过C编程截取桌面并将其保存为.jpg,jpeg,...在计算机中的任何位置?我很想知道是否有任何方法和方法来完成这项任务。我正在使用Windows XP。用C程序截取Windows桌面。
是否有可能通过C编程截取桌面并将其保存为.jpg,jpeg,...在计算机中的任何位置?我很想知道是否有任何方法和方法来完成这项任务。我正在使用Windows XP。用C程序截取Windows桌面。
假设的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);
#include那些:
有很多可用的屏幕截图程序,适用于所有平台。如果你想写自己为什么不看他们,他们做什么? –
@JoachimPileborg:当我搜索时,我使用软件代替代码,所以你可以建议一些链接,它有C,C++,Java,c#中的示例代码。 –
我认为这取决于操作系统。你使用哪个操作系统? – duedl0r