首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 更多程式語言 >> 程式設計綜合問答

MFC 截圖保存到剪貼板後如何查看/使用圖片

     編輯:程式設計綜合問答

代碼邏輯驗證

提供的代碼邏輯大體正確:創建兼容 DC → 創建位圖 → `BitBlt` 複製桌面區域 → `OpenClipboard` → `EmptyClipboard` → `SetClipboardData(CF_BITMAP, hBmp)` → `CloseClipboard`。

關鍵問題:`DeleteObject(hBmp)` 過早釋放

// 錯誤順序
SetClipboardData(CF_BITMAP, hBmp);
CloseClipboard();
DeleteObject(hBmp); // ❌ 剪貼板仍持有 hBmp,此時刪除導致剪貼板數據無效

規則:`SetClipboardData` 後,**所有權轉移給剪貼板**,**不得**手動 `DeleteObject`。系統會在剪貼板清空/關閉時自動釋放。

修正後的關鍵片段

if (OpenClipboard()) {
    EmptyClipboard();
    SetClipboardData(CF_BITMAP, hBmp); // 所有權轉移
    CloseClipboard();
    // 此處 **不要** DeleteObject(hBmp)
    MessageBox(L"截圖已複製到剪貼板");
} else {
    // 打開失敗時才需自行釋放
    DeleteObject(hBmp);
}

如何查看/使用剪貼板圖片

  1. 畫圖:`Win+R` → `mspaint` → `Ctrl+V` 粘貼 → 可編輯/另存為。
  2. Word / PowerPoint / OneNote:`Ctrl+V` 直接插入文檔。
  3. 微信 / QQ / 釘釘聊天框:`Ctrl+V` 直接發送圖片。
  4. 瀏覽器輸入框:`Ctrl+V` 可上傳(如郵件附件、網盤)。
  5. 命令行工具:PowerShell `Get-Clipboard -Format Image | Set-Content -Encoding Byte screenshot.png` 保存文件。

完善建議

  • **多格式兼容**:同時 `SetClipboardData(CF_DIB, hDib)` 支持更多應用(某些舊版應用只認 DIB)。
  • **錯誤處理**:檢查 `OpenClipboard` 返回值,失敗時釋放資源並提示。
  • **DPI 感知**:清單文件加 `true` 或調用 `SetProcessDPIAware()`,避免高 DPI 螢幕截圖模糊。
  • **保存文件功能**:順便用 `CImage::Save` 或 `GDI+` 另存為 PNG/JPG,提供「另存為」選項。

原回答補充

原最佳回答「粘貼到畫圖或 Word 看看」方向正確,但未指出代碼中 `DeleteObject(hBmp)` 過早導致剪貼板數據失效的關鍵 Bug。上文提供修正代碼與完整使用指南。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved