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
相关产品推荐
相关产品推荐

