亲测可用。
VOID _ScreenshotToFile(LPTSTR lpFileName)
{
DWORD iDeskWidth = GetSystemMetrics(SM_CXSCREEN);
DWORD iDeskHeight = GetSystemMetrics(SM_CYSCREEN);
HDC hdcMem = CreateCompatibleDC(0);
HDC hdcdesk = GetDC(0);
HBITMAP bitmap = CreateCompatibleBitmap(hdcdesk, iDeskWidth, iDeskHeight);
SelectObject(hdcMem, bitmap);
BitBlt(hdcMem, 0, 0, iDeskWidth, iDeskHeight, hdcdesk, 0, 0, SRCCOPY);
DeleteDC(hdcMem);
BITMAPFILEHEADER bmfHdr; //位图属性结构
BITMAPINFOHEADER bi; //位图文件头结构
memset(&bi, 0, sizeof(BITMAPINFOHEADER));
bi.biSize = sizeof(BITMAPINFOHEADER);//固定
bi.biWidth = iDeskWidth; //位图宽
bi.biHeight = iDeskHeight;//位图高
bi.biPlanes = 1; //固定
bi.biBitCount = 24;//每个像素位数 此处24位真彩
DWORD dwBmBitsSize = ((iDeskWidth * 24 + 31) / 32) * 4 * iDeskHeight;
HANDLE lpbi = HeapAlloc(GetProcessHeap(),
HEAP_ZERO_MEMORY, dwBmBitsSize + sizeof(BITMAPINFOHEADER));
*(LPBITMAPINFOHEADER)lpbi = bi;
GetDIBits(GetDC(0),
bitmap,
0,
iDeskHeight,
(LPSTR)lpbi + sizeof(BITMAPINFOHEADER),
(LPBITMAPINFO)&bi,
DIB_RGB_COLORS);
HANDLE fh = CreateFile(lpFileName, GENERIC_WRITE,
0, NULL, CREATE_ALWAYS,
FILE_ATTRIBUTE_NORMAL | FILE_FLAG_SEQUENTIAL_SCAN, NULL);
//位图文件头
bmfHdr.bfType = 0x4D42; // "BM"
bmfHdr.bfSize = sizeof(BITMAPFILEHEADER)+sizeof(BITMAPINFOHEADER)+dwBmBitsSize;//!!
bmfHdr.bfReserved1 = 0;
bmfHdr.bfReserved2 = 0;
bmfHdr.bfOffBits = (DWORD)sizeof(BITMAPFILEHEADER)+(DWORD)sizeof(BITMAPINFOHEADER);
DWORD dwWriten;
WriteFile(fh, &bmfHdr, sizeof(BITMAPFILEHEADER), &dwWriten, NULL);
WriteFile(fh, lpbi, sizeof(BITMAPINFOHEADER)+dwBmBitsSize, &dwWriten, NULL);
HeapFree(GetProcessHeap(), HEAP_ZERO_MEMORY, lpbi);
CloseHandle(fh);
}