首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> C語言 >> VC >> 關於VC++

VC++ 螢幕截圖程式設計完整實作

     編輯:關於VC++

螢幕截圖功能雖有 HyperSnap 等現成工具,但若能整合至自有程式中,將大幅擴展應用彈性。本文以 VC++ 在 Windows 95 環境下為例,逐步解析螢幕截圖的核心實作流程:從區域選取、裝置內容建立、位圖複製,到剪貼板存放與 BMP 檔案儲存。

核心函數:CopyScreenToBitmap

此函數接受 LPRECT 結構定義的截圖區域,可針對特定視窗或整個螢幕進行截取。主要流程:

  1. 建立螢幕裝置內容(CreateDC("DISPLAY"))與相容記憶體裝置內容(CreateCompatibleDC)
  2. 根據螢幕解析度修正截圖座標,確保區域可見
  3. 建立與螢幕相容的位圖(CreateCompatibleBitmap)並選入記憶體 DC
  4. 使用 BitBlt 將螢幕畫面複製至記憶體 DC
  5. 清理資源並回傳位圖控制代碼(HBITMAP)
HBITMAP CopyScreenToBitmap(LPRECT lpRect) {
    if (IsRectEmpty(lpRect)) return NULL;
    HDC hScrDC = CreateDC("DISPLAY", NULL, NULL, NULL);
    HDC hMemDC = CreateCompatibleDC(hScrDC);
    // ... 座標計算與邊界檢查 ...
    HBITMAP hBitmap = CreateCompatibleBitmap(hScrDC, nWidth, nHeight);
    HBITMAP hOldBitmap = (HBITMAP)SelectObject(hMemDC, hBitmap);
    BitBlt(hMemDC, 0, 0, nWidth, nHeight, hScrDC, nX, nY, SRCCOPY);
    hBitmap = (HBITMAP)SelectObject(hMemDC, hOldBitmap);
    DeleteDC(hScrDC); DeleteDC(hMemDC);
    return hBitmap;
}

將截圖存入剪貼板

if (OpenClipboard(hWnd)) {
    EmptyClipboard();
    SetClipboardData(CF_BITMAP, hBitmap);
    CloseClipboard();
}

將位圖儲存為 BMP 檔案

SaveBitmapToFile 函數處理位圖檔案格式的完整寫入流程:計算像素位深、調色板大小、建立 BITMAPFILEHEADER、BITMAPINFOHEADER,透過 GetDIBits 取得像素資料,最後以 CreateFile 與 WriteFile 寫入磁碟。支援 1/4/8/24 位元色深,自動處理調色板與像素資料對齊。

int SaveBitmapToFile(HBITMAP hBitmap, LPSTR lpFileName) {
    // 計算位深、調色板、建立 DIB、取得像素資料、寫入檔案頭與資料
    // 完整程式碼請參考原文
}

應用場景

  • 自動化測試截圖記錄
  • 遠端桌面監控畫面擷取
  • 教學軟體操作步驟記錄
  • 錯誤回報自動附上當前畫面
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved