如何在C中将字符串复制到剪贴板?

时间:2009-08-12 03:54:20

标签: c windows winapi clipboard

SetClipboardData函数需要HANDLE引用;我无法转换我的字符串以便在函数中使用。

这是我的代码:

char* output = "Test";
HLOCAL hMem =  LocalAlloc( LHND,1024);
char* cptr = (char*) LocalLock(hMem);
memcpy( cptr, output, 500 );
SetClipboardData(CF_TEXT, hMem);
LocalUnlock( hMem );
LocalFree( hMem );
CloseClipboard();

我在这里做错了什么以及做到这一点的正确方法是什么?

感谢。

3 个答案:

答案 0 :(得分:51)

阅读SetClipboardData功能的MSDN文档。您似乎缺少一些步骤并过早释放内存。首先,你必须打电话 在使用SetClipboardData之前OpenClipboard。其次,系统获取传递给剪贴板的内存的所有权,并且必须解锁。此外,内存必须是可移动的,这需要与GlobalAlloc(而不是LocalAlloc)一起使用的GMEM_MOVEABLE标志。

const char* output = "Test";
const size_t len = strlen(output) + 1;
HGLOBAL hMem =  GlobalAlloc(GMEM_MOVEABLE, len);
memcpy(GlobalLock(hMem), output, len);
GlobalUnlock(hMem);
OpenClipboard(0);
EmptyClipboard();
SetClipboardData(CF_TEXT, hMem);
CloseClipboard();

答案 1 :(得分:12)

我在Windows中编写了一个开源命令行工具:

http://coffeeghost.net/2008/07/25/ccwdexe-copy-current-working-directory-command/

ccwd.exe将当前工作目录复制到剪贴板。当我在源代码库中有多个级别并且需要复制路径时,这很方便。

以下是完整的来源:

#include "stdafx.h"
#include "windows.h"
#include "string.h"
#include <direct.h>

int main()
{
    LPWSTR cwdBuffer;

    // Get the current working directory:
    if( (cwdBuffer = _wgetcwd( NULL, 0 )) == NULL )
        return 1;

    DWORD len = wcslen(cwdBuffer);
    HGLOBAL hdst;
    LPWSTR dst;

    // Allocate string for cwd
    hdst = GlobalAlloc(GMEM_MOVEABLE | GMEM_DDESHARE, (len + 1) * sizeof(WCHAR));
    dst = (LPWSTR)GlobalLock(hdst);
    memcpy(dst, cwdBuffer, len * sizeof(WCHAR));
    dst[len] = 0;
    GlobalUnlock(hdst);

    // Set clipboard data
    if (!OpenClipboard(NULL)) return GetLastError();
    EmptyClipboard();
    if (!SetClipboardData(CF_UNICODETEXT, hdst)) return GetLastError();
    CloseClipboard();

    free(cwdBuffer);
    return 0;
}

答案 2 :(得分:0)

看看Microsoft's Documentation on using the clipboard。这需要您使用WinAPI,但这应该不是问题,因为您在Windows上。请注意,除非使用非常高级的语言,否则编写Windows API绝非易事。