設置 | 登錄 | 註冊

目前共有7篇帖子。

【代碼】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

內容轉換:

回覆帖子
內容:
用戶名: 您目前是匿名發表。
驗證碼:
看不清?換一張
©2010-2025 Purasbar Ver3.0 [手機版] [桌面版]
除非另有聲明,本站採用知識共享署名-相同方式共享 3.0 Unported許可協議進行許可。