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

28 c windows clipboard winapi

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();
Run Code Online (Sandbox Code Playgroud)

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

谢谢.

Jud*_*den 55

阅读SetClipboardData函数的MSDN文档.您似乎缺少一些步骤并过早释放内存.首先,您必须先调用 OpenClipboard,然后才能使用SetClipboardData.其次,系统获取传递给剪贴板的内存的所有权,并且必须解锁.此外,内存必须是可移动的,这需要与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();
Run Code Online (Sandbox Code Playgroud)

  • 因为SetClipboardData不接受长度参数,所以当你使用CF_TEXT时,它必须弄清楚字符串结尾的位置.有关详细信息,请参阅http://msdn.microsoft.com/en-us/library/windows/desktop/ff729168(v=vs.85).aspx (2认同)
  • 根据[文档](https://learn.microsoft.com/en-us/windows/desktop/api/winuser/nf-winuser-setclipboarddata),这个答案是错误的。您必须将有效的“HWND”传递给“OpenClipboard”。引用:“_如果应用程序在 hwnd 设置为 NULL 的情况下调用 OpenClipboard,EmptyClipboard 将剪贴板所有者设置为 NULL;这会导致 SetClipboardData 失败_” (2认同)

小智 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;
}
Run Code Online (Sandbox Code Playgroud)