如何将字符数组复制到剪贴板

How do I copy a character array to the clipboard?

本文关键字:复制 剪贴板 数组 字符      更新时间:2023-10-16

我正在尝试让我的应用程序将字符数组复制到剪贴板,以便将其粘贴到IE地址栏中。我在工作时遇到问题。这是我正在使用的代码:

HGLOBAL glob = GlobalAlloc(GMEM_FIXED,32);
memcpy(glob,array,sizeof(array));
OpenClipboard(hDlg);
EmptyClipboard();
SetClipboardData(CF_UNICODETEXT,glob);
CloseClipboard();

数组声明为:

char array[500];

这将导致程序崩溃。但是,如果我用数字切换sizeof(array),那还可以,但是只有 8 个字符被复制到剪贴板。

谁能建议我如何解决这个问题?我直接针对Win32 API,而不是使用MFC。

您只分配了 32 字节的全局内存:

GlobalAlloc(GMEM_FIXED,32);

。然后尝试将 500 字节塞入 32 字节的包中:

memcpy(glob,array,sizeof(array));

将 GlobalAlloc 更改为:

GlobalAlloc(GMEM_FIXED,sizeof(array));

此外,您将数据粘贴为 Unicode 文本 ( CF_UNICODETEXT ),但它不是 Unicode 文本。 我想这会导致...问题。

改为将其粘贴为纯文本:

SetClipboardData(CF_TEXT,glob);

您正在将 500 个字符 ( sizeof(array) ) 复制到只有 32 个字符空间的缓冲区中。所有剩余的字符都会践踏随机数据并导致崩溃。

我创建了一个函数来保存和加载剪贴板。

#include <Windows.h>
char* LoadClipboard()
{
    static HANDLE clip;
    if(OpenClipboard(NULL))
    {
        clip = GetClipboardData(CF_TEXT);
        CloseClipboard();
    }
    return (char*) clip;
}
void SaveClipboard(char* text)
{
    HGLOBAL global = GlobalAlloc(GMEM_FIXED,strlen(text) + 1); //text size +  character
    memcpy(global,text,strlen(text));  //text size +  character
    if(OpenClipboard(NULL))
    {
        EmptyClipboard();
        SetClipboardData(CF_TEXT,global);
        CloseClipboard();
    }
}