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

如何在C语言中将字符串复制到剪贴板?,c,windows,winapi,clipboard,C,Windows,Winapi,Clipboard,SetClipboardData函数需要一个句柄引用;我在转换字符串以便在函数中使用时遇到问题 这是我的密码: char* output = "Test"; HLOCAL hMem = LocalAlloc( LHND,1024); char* cptr = (char*) LocalLock(hMem); memcpy( cptr, output, 500 ); SetClipboardData(CF_TEXT, hMem); LocalUnlock( hMem ); LocalFree(

SetClipboardData
函数需要一个
句柄
引用;我在转换字符串以便在函数中使用时遇到问题

这是我的密码:

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();
我做错了什么?正确的方法是什么


谢谢。

看一看。这要求您必须使用WinAPI,但这不应该是问题,因为您的Windows支持。请注意,除非您使用非常高级的语言,否则Windows API的编程从来都不简单。

请阅读MSDN文档了解该函数。您似乎错过了几个步骤,过早地释放了内存。首先,你必须打电话 在使用SetClipboardData之前。其次,系统拥有传递到剪贴板的内存,并且必须解锁。此外,内存必须是可移动的,这需要使用GMEM_MOVEABLE标志(而不是LocalAlloc)


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

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;
}
#包括“stdafx.h”
#包括“windows.h”
#包括“string.h”
#包括
int main()
{
LPWSTR cwdBuffer;
//获取当前工作目录:
if((cwdBuffer=_wgetcwd(NULL,0))==NULL)
返回1;
DWORD len=wcslen(cwdBuffer);
HGLOBAL-hdst;
LPWSTR dst;
//为cwd分配字符串
hdst=全球ALLOC(GMEM_可移动| GMEM_数据共享,(len+1)*大小(WCHAR));
dst=(LPWSTR)全局时钟(hdst);
memcpy(dst、cwdBuffer、len*sizeof(WCHAR));
dst[len]=0;
GlobalUnlock(hdst);
//设置剪贴板数据
如果(!OpenClipboard(NULL))返回GetLastError();
清空电路板();
如果(!SetClipboardData(CF_UNICODETEXT,hdst))返回GetLastError();
CloseClipboard();
免费(cwdBuffer);
返回0;
}

好吧,我已经研究过了,找到了不起作用的代码。你可以试着复制准确的代码,看看它是否起作用。那你就可以从那里走了。对我来说也是如此。。。有两个更正:GMEM_MOVEABLE和OpenClipboard()中未传递任何参数;为什么还要复制空字节终止符呢?因为SetClipboardData不接受长度参数,所以在使用CF_TEXT时,它必须找出字符串的结尾位置。有关更多信息,请参阅我是否正确理解,如果对SetClipboardData的调用为您成功执行系统免费调用(hMem)?根据,此答案是错误的。您必须将有效的
HWND
传递到
OpenClipboard
。Quote:“如果应用程序调用OpenClipboard时hwnd设置为NULL,EmptyClipboard会将剪贴板所有者设置为NULL;这会导致SetClipboardData失败”+1是的,它很容易读取、复制,并且可以正常工作,这正是我所寻找的。而CF_Unicodext是一个恐怖的没有得到。CF_文本在普通美国ASCII码中仅生成一个字母。DWORD len应该是一个大小的len(没有收到编译器的投诉)。
#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;
}