SetClipboardData
函数需要一个HANDLE
引用; 我遇到麻烦转换我的string在函数中使用。
这是我的代码:
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();
我在做什么错在这里,有什么正确的方法来做到这一点?
谢谢。
阅读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();
我写了一个开源的命令行工具来在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; }
看看微软使用剪贴板的文档 。 这就要求你使用WinAPI,但这不应该成为你在Windows上的问题。 请注意,除非您使用非常高级的语言,否则编程Windows API绝非易事。