[Windows-macOS]_[C/C++-Object-c]_[複製文本和圖片到剪切板]

場景

  1. Windows,macOS開發界面時,往往需要複製界面上的文本內容到剪切板,或者需要把一個圖片複製到剪切板,便於粘貼到QQ,微信裏,怎麼做到呢?

說明

  1. 無論時Windows還是macOS,都有相對應的複製文本到剪切板或者複雜圖片到剪切板, 文本方面不用說,不會很複雜,複雜的地方就在於複製圖片到剪切板上.

  2. Windows有需要存儲BITMAP到圖像格式,所以在保存前需要得到BITMAP格式,方便的是Gdiplus爲我們提供了Bitmap類,並可以把類Bitmap轉換爲BITMAP格式,之後把這個格式數據通過Win32函數SetClipboardData存儲到剪切板裏。

  3. macOS可以存儲PNGTIFF格式,但是不需要轉換,只需要把通用數據類型NSData存儲即可。

macOS 例子

存儲文本


[[NSPasteboard generalPasteboard] clearContents];
[[NSPasteboard generalPasteboard] setString:ms->text_ forType:NSStringPboardType];

存儲圖片

NSData* imageData = [NSData dataWithContentsOfFile:[NSString stringWithUTF8String:path]];
NSImage* image = [[NSImage alloc] initWithData:imageData];
NSPasteboard* paste = [NSPasteboard generalPasteboard];
[paste clearContents];
[paste setData:imageData forType:NSPasteboardTypePNG];

Windows 例子

儲存文本

注意GlobalAlloc出來的對象, 如果SetClipboardData成功, 那麼對象hdst就會被系統持有,不需要自己釋放.


size_t len = chat->body.size();
// Allocate string for cwd
hdst = GlobalAlloc(GMEM_MOVEABLE | GMEM_DDESHARE, (len + 1) * sizeof(WCHAR));
dst = (LPWSTR)GlobalLock(hdst);
memcpy(dst, chat->body.c_str(), len * sizeof(WCHAR));
dst[len] = 0;
GlobalUnlock(hdst);

int result = 0;
// Set clipboard data
if (!OpenClipboard()){
	GlobalFree(hdst);
	return;
}
EmptyClipboard();
if (!SetClipboardData(CF_UNICODETEXT, hdst)){
	GlobalFree(hdst);
	return;
}
CloseClipboard();

存儲圖片


static bool CopyFileToClipboard(const wchar_t* path)
{
	bool result = false;
    Gdiplus::Bitmap *gdibmp = Gdiplus::Bitmap::FromFile(path);
    if (gdibmp)
    {
        HBITMAP hbitmap;
        gdibmp->GetHBITMAP(0, &hbitmap);
        if (OpenClipboard(NULL))
        {
            EmptyClipboard();
            DIBSECTION ds;
            if (GetObject(hbitmap, sizeof(DIBSECTION), &ds))
            {
                HDC hdc = GetDC(HWND_DESKTOP);
                //create compatible bitmap (get DDB from DIB)
                HBITMAP hbitmap_ddb = CreateDIBitmap(hdc, &ds.dsBmih, CBM_INIT,
                    ds.dsBm.bmBits, (BITMAPINFO*)&ds.dsBmih, DIB_RGB_COLORS);
                ReleaseDC(HWND_DESKTOP, hdc);
                SetClipboardData(CF_BITMAP, hbitmap_ddb);
                DeleteObject(hbitmap_ddb);
                result = true;
            }
            CloseClipboard();
        }

        //cleanup:
        DeleteObject(hbitmap);  
        delete gdibmp;              
    }
    return result;
}

參考

1.how-to-copy-a-picture-from-disk-into-the-clipboard-with-win32

2.how-to-take-region-screenshot-in-mac-os-x-using-cocoa-and-cgdisplaycreateimagefo

3.how-to-copy-textfield-to-osx-clipboard

4.nspasteboard-setdatafortype-nsimage-fails-for-png-file

5.nf-winuser-setclipboarddata

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章