作者共發了7篇帖子。 字體大小:較小 - 100% (默認)▼  內容轉換:不轉換▼
 
點擊 回復
423 6
【代码】C++操作Windows的剪切板的文本内容
一派護法 十九級
1樓 發表于:2016-1-1 21:58
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();
}
说明:编译前,请将工程改为使用单字节字符串的版本。
一派護法 十九級
2樓 發表于:2016-1-1 23:25
回復1樓 @巨大八爪鱼 的內容:
void cut(HWND hWnd)
{
    TCHAR str[] = TEXT("information");...
“单字节字符串”就是“多字节字符集”
一派護法 十九級
3樓 發表于:2016-1-2 11:59
如果被粘贴对象是一个句柄,比如位图句柄HBITMAP,窗口句柄HWND,那么就可以直接放入SetClipboardData作为参数,无需创建hMem全局句柄。
一派護法 十九級
4樓 發表于:2016-1-3 13:13
如果要想把宽字符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会在粘贴的时候自动完成转换。
一派護法 十九級
5樓 發表于:2016-1-3 13:46
【设置为直到粘贴时才获取内容】
响应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执行成功,这个函数以后就不再被调用。如果执行失败则会在每次粘贴时都调用,直到最终成功。
一派護法 十九級
6樓 發表于:2016-1-3 14:53
【复制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();
一派護法 十九級
7樓 發表于:2016-1-3 14:59
在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

回復帖子

內容:
用戶名: 您目前是匿名發表
驗證碼:
(快捷鍵:Ctrl+Enter)
 

本帖信息

點擊數:423 回複數:6
評論數: ?
作者:巨大八爪鱼
最後回復:巨大八爪鱼
最後回復時間:2016-1-3 14:59
 
©2010-2024 Arslanbar Ver2.0
除非另有聲明,本站採用創用CC姓名標示-相同方式分享 3.0 Unported許可協議進行許可。