该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)
小智 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)
| 归档时间: |
|
| 查看次数: |
34961 次 |
| 最近记录: |