C++读取系统剪贴板数据(windows)

本文档展示了如何使用C++在Windows环境下读取剪贴板中的文件列表、图片(位图和DIB格式)以及文本数据。通过`GetClipboardData`和`EnumClipboardFormats`等API函数,可以获取剪贴板的各种格式数据,如CF_HDROP(文件列表)、CF_BITMAP(位图)、CF_DIB(设备无关位图)和CF_UNICODETEXT(Unicode文本)。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

// 显示剪贴板的文本
#include <comdef.h>
#include <iostream>
#include <oleidl.h>
#include <string>
#include <vector>
#include <windows.h>
using namespace std;

std::vector<std::string> GetPaths() {
  std::vector<std::string> path_list;

  HDROP hDrop =
      HDROP(::GetClipboardData(CF_HDROP)); // 获取剪切板中复制的文件列表相关句柄

  if (hDrop != NULL) {
    WCHAR szFilePathName[MAX_PATH + 1] = {0};

    UINT nNumOfFiles =
        DragQueryFile(hDrop, 0xFFFFFFFF, NULL, 0); // 得到文件个数

    // 考虑到用户可能同时选中了多个对象(可能既包含文件也包含文件夹),所以要循环处理
    for (UINT nIndex = 0; nIndex < nNumOfFiles; ++nIndex) {
      memset(szFilePathName, 0, MAX_PATH + 1);
      DragQueryFile(hDrop, nIndex, szFilePathName, MAX_PATH); // 得到文件名

      _bstr_t path(szFilePathName);
      std::string ss = (LPCSTR)path;

      path_list.push_back(ss);
    }
  }

  return path_list;
}

int GetBitmapSize() {
  int nSize = 0;
  // 打开剪切板,并且剪切板里存在图片
  if (IsClipboardFormatAvailable(CF_BITMAP)) {
    // 取得剪切板中的图片数据
    HGLOBAL hClipBoard = GetClipboardData(CF_BITMAP);
    if (hClipBoard) {
      //从剪贴板中取出一个内存的句柄
      // 获取内存大小
      // nSize = GlobalSize(hClipBoard);
      //对内存块进行加锁,将内存句柄值转化为一个指针,并将内存块的引用计数器加一,内存中的数据也返回到指针型变量中
      // char &data = new char[nSize];
      // memcpy(data, GlobalLock(hClipBoard), nSize);
      // 将数据存储
      //将内存块的引用计数器减一
      GlobalUnlock(hClipBoard);
      //关闭剪贴板,释放剪贴板资源的占用权
      CloseClipboard();
    }
  }
  return nSize;
}

//返回值:
// 0 - 存储bmp文件成功
// 1 - 剪贴板内容非DIB格式
// 2 - 打开剪贴板失败
// 3 - 存储bmp文件失败
#include <io.h>
#include <stdio.h>
#include <stdlib.h>
#include <windows.h>
int SaveBmpFileFromClipboard(const char *file_name = "capture.bmp") {
  HANDLE hDib;
  LPVOID lpDib;
  BITMAPFILEHEADER bfBuf;

  if (IsClipboardFormatAvailable(CF_DIB)) //检查剪贴板内容是否为DIB类型的数据
  {
    hDib = GetClipboardData(CF_DIB

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

编程经验随笔

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值