代码之家  ›  专栏  ›  技术社区  ›  unknown

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

  •  25
  • unknown  · 技术社区  · 17 年前

    这个 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 回复  |  直到 8 年前
        1
  •  51
  •   Judge Maygarden    14 年前

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

    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();
    
        2
  •  11
  •   Al S.    15 年前

    我在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;
    }
    
        3
  •  0
  •   Kredns    17 年前

    看一看 Microsoft's Documentation on using the clipboard . 这要求您使用winapi,但这不应该是一个问题,因为您在Windows上。请注意,除非您使用非常高级的语言,否则对WindowsAPI进行编程永远都不简单。