|
【代码】C++操作Windows的剪切板的文本内容 |
一派护法 十九级 |
void cut(HWND hWnd) { TCHAR str[] = TEXT("information"); HGLOBAL hMem = GlobalAlloc(GMEM_MOVEABLE, sizeof(str)); LPTSTR lptStr = (LPTSTR)GlobalLock(hMem); memcpy(lptStr, str, sizeof(str)); GlobalUnlock(hMem);
OpenClipboard(hWnd); EmptyClipboard(); SetClipboardData(CF_TEXT, hMem); CloseClipboard(); }
void paste(HWND hWnd) { if (!IsClipboardFormatAvailable(CF_TEXT)) { MessageBox(hWnd, TEXT("剪切板中没有文本内容!"), TEXT("剪切板"), MB_ICONWARNING); return; } OpenClipboard(hWnd); HGLOBAL hMem = GetClipboardData(CF_TEXT); if (hMem) { LPTSTR str = (LPTSTR)GlobalLock(hMem); if (str) { MessageBox(hWnd, str, TEXT("剪切板内容"), MB_ICONWARNING); GlobalUnlock(hMem); } } CloseClipboard(); } 说明:编译前,请将工程改为使用单字节字符串的版本。
|
一派护法 十九级 |
void cut(HWND hWnd) { TCHAR str[] = TEXT("information");...
“单字节字符串”就是“多字节字符集”
|
一派护法 十九级 |
3楼
发表于: 2016-1-2 11:59
如果被粘贴对象是一个句柄,比如位图句柄HBITMAP,窗口句柄HWND,那么就可以直接放入SetClipboardData作为参数,无需创建hMem全局句柄。
|
一派护法 十九级 |
如果要想把宽字符wchar_t文本内容放入到剪切板中,只需将剪切板格式改为CF_UNICODETEXT就行了: int _tmain(int argc, _TCHAR* argv[]) { time_t t = time(NULL); WCHAR wstr[30]; LPWSTR pwStr; HGLOBAL hMem; swprintf_s(wstr, L"请注意,当前的UNIX时间戳是%ld。", t); OpenClipboard(NULL); EmptyClipboard(); hMem = GlobalAlloc(GMEM_MOVEABLE, sizeof(wstr)); pwStr = (LPWSTR)GlobalLock(hMem); memcpy(pwStr, wstr, sizeof(wstr)); GlobalUnlock(hMem); SetClipboardData(CF_UNICODETEXT, hMem); CloseClipboard();
system("pause"); return 0; } 在CF_TEXT和CF_UNICODETEXT这两种格式中,剪切/复制时只需放置一种格式就行了,不需要两个格式都放。因为Windows会在粘贴的时候自动完成转换。
|
一派护法 十九级 |
【设置为直到粘贴时才获取内容】 响应Windows消息: case WM_RENDERFORMAT: renderFormat(wParam); break;
剪切命令执行函数: void cut(HWND hWnd) { OpenClipboard(hWnd); EmptyClipboard(); SetClipboardData(CF_UNICODETEXT, NULL); CloseClipboard(); }
响应WM_RENDERFORMAT消息的函数,获取内容: void renderFormat(WPARAM wParam) { if (wParam != CF_UNICODETEXT) return; time_t tm = time(NULL); WCHAR wstr[30]; swprintf_s(wstr, L"时间戳: %ld", tm); HGLOBAL hMem = GlobalAlloc(GMEM_MOVEABLE, sizeof(wstr)); LPWSTR pwStr = (LPWSTR)GlobalLock(hMem); memcpy(pwStr, wstr, sizeof(wstr));
GlobalUnlock(hMem); SetClipboardData(CF_UNICODETEXT, hMem); } 一旦SetClipboardData执行成功,这个函数以后就不再被调用。如果执行失败则会在每次粘贴时都调用,直到最终成功。
|
一派护法 十九级 |
【复制wstring字符串对象的例子】 wstring str = L"简体中文abc"; int size = (str.length() + 1) * sizeof(wchar_t); HGLOBAL hMem; LPWSTR pStr;
OpenClipboard(NULL); EmptyClipboard(); hMem = GlobalAlloc(GMEM_MOVEABLE, size); pStr = (LPWSTR)GlobalLock(hMem); memcpy(pStr, str.data(), size); GlobalUnlock(hMem); SetClipboardData(CF_UNICODETEXT, hMem); CloseClipboard();
|
一派护法 十九级 |
在Visual Studio 2012的Win32控制台程序中,如果char字符数组包含汉字,那么粘贴的时候就会乱码。改用wchar_t字符数组并把剪切板格式设为CF_UNICODETEXT后问题解决。 例如: char str[] = "abc中文def"; HGLOBAL hMem; char *pStr;
OpenClipboard(NULL); EmptyClipboard(); hMem = GlobalAlloc(GMEM_MOVEABLE, sizeof(str)); pStr = (char *)GlobalLock(hMem); memcpy(pStr, str, sizeof(str)); GlobalUnlock(hMem); SetClipboardData(CF_TEXT, hMem); CloseClipboard(); 执行程序后,剪切板的内容为:abcÖÐÎÄdef
|