這是初步,主要展示取得一個 window handle 後,將其 window 存成 bmp 圖檔。至於要存哪個 window,
可再用 FindWindow 與 FindWindowEx 繼續找下去
#include <windows.h> #include <stdio.h> void CaptureScreen( HWND hwnd, char *filename) { HDC hdcWindow; HDC hdcMemory; HBITMAP hBitmap; BYTE *lpvBits; BITMAPINFO bi; BITMAPINFOHEADER bih; BITMAPFILEHEADER bifh; HANDLE hFile; DWORD dwBytesWritten = 0; DWORD dwSize; int xSize, ySize; RECT rect; hdcWindow = GetDC(NULL); GetWindowRect(hwnd, &rect); xSize = rect.right - rect.left; ySize = rect.bottom - rect.top; hBitmap = CreateCompatibleBitmap(hdcWindow, xSize, ySize); hdcMemory = CreateCompatibleDC(hdcWindow); SelectObject(hdcMemory, hBitmap); BitBlt(hdcMemory, 0, 0, xSize, ySize, hdcWindow, rect.left, rect.top, SRCCOPY); bih.biSize = sizeof(BITMAPINFOHEADER); bih.biWidth = xSize; bih.biHeight = ySize; bih.biPlanes = 1; bih.biBitCount = 32; bih.biCompression = BI_RGB; bih.biSizeImage = 0; bih.biXPelsPerMeter = 0; bih.biYPelsPerMeter = 0; bih.biClrUsed = 0; bih.biClrImportant = 0; dwSize = (((xSize * 32 + 31)/32) * 4 * ySize); lpvBits = (BYTE*)malloc(dwSize); bifh.bfType = 0x4D42; bifh.bfSize = sizeof(BITMAPFILEHEADER) + sizeof(BITMAPINFOHEADER) + dwSize; bifh.bfOffBits = (DWORD)sizeof(BITMAPFILEHEADER) + (DWORD)sizeof(BITMAPINFOHEADER); bifh.bfReserved1 = 0; bifh.bfReserved2 = 0; bi.bmiHeader = bih; GetDIBits(hdcMemory, hBitmap, 0, (UINT)ySize, lpvBits, &bi, DIB_RGB_COLORS); hFile = CreateFile(filename, GENERIC_WRITE, 0, NULL, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL); WriteFile(hFile, (LPSTR)&bifh, sizeof(BITMAPFILEHEADER), &dwBytesWritten, NULL); WriteFile(hFile, (LPSTR)&bih, sizeof(BITMAPINFOHEADER), &dwBytesWritten, NULL); WriteFile(hFile, (LPSTR)lpvBits, dwSize, &dwBytesWritten, NULL); DeleteDC(hdcMemory); DeleteObject(hBitmap); CloseHandle(hFile); free(lpvBits); ReleaseDC(hwnd, hdcWindow); } int main() { HWND hwnd = GetConsoleWindow(); HWND hdesktop = GetDesktopWindow(); printf("Hello, World!!"); CaptureScreen(hwnd, "D:\\a.bmp"); /* 截取此 console 視窗圖片 */ /* 將此 console 隱藏,避免截取桌面時截到 console window */ // ShowWindow(hwnd, 0); CaptureScreen(hdesktop, "D:\\desktop.bmp"); /* 截取目前桌面圖片 */ return 0; }
全站熱搜