You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

GetClipboardFormatNameW调用失败,错误码87:参数不正确的问题求助

解决GetClipboardFormatNameW调用返回错误码87的问题

错误原因

GetClipboardFormatNameW函数仅支持获取通过RegisterClipboardFormatW注册的自定义剪贴板格式的名称。像CF_HDROP这类系统预定义的标准剪贴板格式,调用该函数会直接返回失败,错误码87(ERROR_INVALID_PARAMETER),这是函数的设计限制。

修正后的代码

#pragma comment (lib, "User32.lib")

#include <windows.h>
#include <iostream>
#include <map>

// 预定义标准剪贴板格式名称映射表
const std::map<UINT, const wchar_t*> standardFormatNames = {
    {CF_HDROP, L"CF_HDROP"},
    {CF_TEXT, L"CF_TEXT"},
    {CF_UNICODETEXT, L"CF_UNICODETEXT"},
    {CF_BITMAP, L"CF_BITMAP"},
    // 可根据需求添加更多标准格式
};

int main() {
    // 打开剪贴板
    if (!OpenClipboard(nullptr)) {
        std::cerr << "打开剪贴板失败。" << std::endl;
        return 1;
    }

    UINT format = CF_HDROP;
    WCHAR formatName[256];
    int length = 0;
    DWORD dwError = 0;

    // 判断格式类型:自定义格式(>=CF_PRIVATEFIRST)才调用GetClipboardFormatNameW
    if (format >= CF_PRIVATEFIRST) {
        length = GetClipboardFormatNameW(format, formatName, sizeof(formatName) / sizeof(WCHAR));
        dwError = GetLastError();
    } else {
        // 从预定义映射表中查找标准格式名称
        auto nameIter = standardFormatNames.find(format);
        if (nameIter != standardFormatNames.end()) {
            wcscpy_s(formatName, sizeof(formatName)/sizeof(WCHAR), nameIter->second);
            length = wcslen(formatName);
        }
    }

    // 输出结果
    if (length > 0) {
        std::wcout << L"剪贴板格式名称: " << formatName << std::endl;
    } else {
        std::cerr << "获取剪贴板格式名称失败。错误码: " << dwError << std::endl;
    }

    // 关闭剪贴板
    CloseClipboard();

    return 0;
}

编译命令

cl /EHsc GetClipboardFormatNameTEST.cpp

说明

  • 对于系统预定义格式,通过手动维护的映射表直接返回名称,避免调用GetClipboardFormatNameW触发错误。
  • 仅当格式值大于等于CF_PRIVATEFIRST时,才调用GetClipboardFormatNameW获取自定义格式的名称,符合函数的使用规范。

内容的提问来源于stack exchange,提问作者Derek Johnson

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.14 17:25:03