OpenClipboard 是 Windows API (Application Programming Interface) 中的一个函数,它不属于标准的 C 语言库(如 stdio.h 或 stdlib.h),你不能在纯 Linux、macOS 或其他非 Windows 环境下直接使用它。

这个函数的主要作用是打开 Windows 系统的剪贴板,以便应用程序可以读取或写入剪贴板中的数据,一次只能有一个窗口成功打开剪贴板,如果一个应用程序打开了剪贴板,其他应用程序必须等待它关闭剪贴板后才能打开。
函数原型
你需要在你的 C 代码中包含 windows.h 头文件才能使用这个函数。
#include <windows.h> BOOL OpenClipboard( HWND hWndNewOwner // 拥有剪贴板的窗口句柄 );
参数说明
hWndNewOwner:- 这是一个
HWND(Handle to a Window) 类型的参数,代表将拥有剪贴板的窗口的句柄。 - 如果你的应用程序只是想从剪贴板读取数据,可以将其设置为
NULL,在这种情况下,剪贴板的所有权不会改变。 - 如果你的应用程序要向剪贴板写入数据,通常需要传递一个有效的窗口句柄,这个窗口会在剪贴板被使用时接收相关的窗口消息(如
WM_RENDERFORMAT和WM_DESTROYCLIPBOARD)。 - 你可以使用
GetConsoleWindow()函数来获取当前控制台窗口的句柄,如果你在控制台应用程序中使用它。
- 这是一个
返回值
TRUE(非零): 函数调用成功,剪贴板已成功打开。FALSE(零): 函数调用失败,剪贴板可能已经被另一个应用程序打开,或者发生了其他错误。
你可以调用 GetLastError() 函数来获取更详细的错误信息。
使用流程
使用 OpenClipboard 的标准流程通常遵循以下步骤:

- 打开剪贴板: 调用
OpenClipboard()。 - 检查返回值: 如果返回
FALSE,说明操作失败,应立即退出。 - 清空剪贴板 (可选但推荐): 在写入数据之前,调用
EmptyClipboard(),这会清除剪贴板中所有现有的数据格式,并使你的窗口成为剪贴板所有者。 - 操作剪贴板:
- 写入: 使用
SetClipboardData()函数将数据放入剪贴板。 - 读取: 使用
GetClipboardData()函数从剪贴板获取数据。
- 写入: 使用
- 关闭剪贴板: 非常重要! 完成所有操作后,必须调用
CloseClipboard()来释放剪贴板,以便其他应用程序可以使用它。
代码示例
下面是一个完整的 C 语言示例,它演示了如何打开剪贴板、向其中写入一段文本,然后再读取出来并打印到控制台。
#include <windows.h>
#include <stdio.h>
#include <tchar.h> // 用于 _tprintf
int main() {
// 1. 定义要写入剪贴板的文本
const TCHAR* textToCopy = _T("Hello from C Program via Windows Clipboard!");
// --- 第一步:向剪贴板写入数据 ---
// a. 打开剪贴板
// 使用 GetConsoleWindow() 获取当前控制台窗口的句柄作为所有者
if (!OpenClipboard(GetConsoleWindow())) {
_tprintf(_T("Failed to open clipboard. Error: %d\n"), GetLastError());
return 1;
}
_tprintf(_T("Clipboard opened for writing.\n"));
// b. 清空剪贴板
// 这是一个好习惯,尤其是在写入数据之前
EmptyClipboard();
// c. 准备数据并放入剪贴板
// CF_TEXT 是一个标准的剪贴板格式,表示以 null 结尾的 ANSI 文本
// GlobalAlloc 分配一个可被其他进程访问的内存块
HGLOBAL hglbCopy = GlobalAlloc(GMEM_MOVEABLE, (_tcslen(textToCopy) + 1) * sizeof(TCHAR));
if (hglbCopy == NULL) {
_tprintf(_T("Failed to allocate memory for clipboard data.\n"));
CloseClipboard(); // 记得关闭剪贴板
return 1;
}
// 锁定内存块并复制数据
LPTSTR lptstrCopy = (LPTSTR)GlobalLock(hglbCopy);
if (lptstrCopy == NULL) {
_tprintf(_T("Failed to lock memory.\n"));
GlobalFree(hglbCopy);
CloseClipboard();
return 1;
}
memcpy(lptstrCopy, textToCopy, (_tcslen(textToCopy) + 1) * sizeof(TCHAR));
GlobalUnlock(hglbCopy); // 解锁内存
// 将数据放入剪贴板
SetClipboardData(CF_TEXT, hglbCopy);
_tprintf(_T("Text copied to clipboard: \"%s\"\n"), textToCopy);
// d. 关闭剪贴板
CloseClipboard();
_tprintf(_T("Clipboard closed.\n\n"));
// --- 第二步:从剪贴板读取数据 ---
// a. 再次打开剪贴板
if (!OpenClipboard(NULL)) { // 这里用 NULL,因为我们只是读取
_tprintf(_T("Failed to open clipboard for reading. Error: %d\n"), GetLastError());
return 1;
}
_tprintf(_T("Clipboard opened for reading.\n"));
// b. 获取剪贴板数据
HANDLE hglbPaste = GetClipboardData(CF_TEXT);
if (hglbPaste == NULL) {
_tprintf(_T("Failed to get clipboard data. Is it empty or not text?\n"));
CloseClipboard();
return 1;
}
// c. 锁定并读取数据
LPTSTR lptstrPaste = (LPTSTR)GlobalLock(hglbPaste);
if (lptstrPaste == NULL) {
_tprintf(_T("Failed to lock pasted data.\n"));
CloseClipboard();
return 1;
}
_tprintf(_T("Text pasted from clipboard: \"%s\"\n"), lptstrPaste);
GlobalUnlock(hglbPaste); // 解锁内存
// d. 关闭剪贴板
CloseClipboard();
_tprintf(_T("Clipboard closed.\n"));
return 0;
}
如何编译和运行
- 将上述代码保存为
clipboard_example.c。 - 使用支持 Windows API 的编译器(如 Visual Studio 的 cl.exe 或 MinGW 的 gcc)进行编译。
- 使用 MinGW/GCC 的命令:
gcc -m clipboard_example.c -o clipboard_example.exe
- 使用 MinGW/GCC 的命令:
- 运行生成的
clipboard_example.exe程序。 - 程序运行后,它会自动将 "Hello from C Program..." 这段文本复制到剪贴板,你可以打开记事本或其他文本编辑器,按
Ctrl+V粘贴查看。
重要注意事项
-
平台依赖性:
OpenClipboard是 Windows 特有的,如果你想让你的代码跨平台,你需要使用预处理器指令来隔离 Windows 相关的代码。#ifdef _WIN32 // 包含 windows.h 并使用 OpenClipboard #else // 在 Linux/macOS 上使用其他方法,如 X11 的 XCutPaste 或 Qt 的剪贴板类 #endif -
关闭剪贴板: 永远不要忘记调用
CloseClipboard(),如果忘记关闭,其他程序将无法访问剪贴板,导致它们“挂起”,直到你的程序结束,这会严重影响用户体验。 -
内存管理: 当你使用
SetClipboardData时,你只是将内存的所有权“转移”给了剪贴板,剪贴板会在数据不再需要时自动释放这块内存。在调用SetClipboardData之后,你不应该再GlobalFree或LocalFree那块内存,同样,当你从GetClipboardData获取数据时,这块内存属于剪贴板,你只负责读取,使用完毕后也不要手动释放它。
(图片来源网络,侵删) -
剪贴板格式:
CF_TEXT只是其中一种格式,Windows 剪贴板支持多种格式,CF_UNICODETEXT: 用于宽字符(如 UTF-16)文本。CF_HDROP: 用于文件拖放。CF_BITMAP: 用于位图图像。- 自定义格式: 你可以注册自己的剪贴板格式来传输复杂的数据结构。
希望这个详细的解释能帮助你理解和使用 C 语言中的 OpenClipboard 函数!
