Windows如何实现剪贴板格式转换?

how does Windows implement clipboard format conversion?

我正在 Windows 上为我的应用程序沙箱系统实现剪贴板。我必须自己模拟剪贴板行为。现在,除了格式转换部分外,一切正常,我可以为 CF_TEXT/UNICODETEXT/OEMTEXT 做这件事,但还有其他我不熟悉的格式,如 DIB。是否有任何示例代码说明 Windows 如何做到这一点?

CF_DIB和其他剪贴板格式的区别在于它包含BITMAPINFO结构和位图位的内存对象。

msdn document已经提供了非常详细的例子:

HINSTANCE hinst; 
UINT uFormat = (UINT)(-1); 
BOOL fAuto = TRUE; 
 
LRESULT APIENTRY MainWndProc(hwnd, uMsg, wParam, lParam) 
HWND hwnd; 
UINT uMsg; 
WPARAM wParam; 
LPARAM lParam; 
{ 
    static HWND hwndNextViewer; 
 
    HDC hdc; 
    HDC hdcMem; 
    PAINTSTRUCT ps; 
    LPPAINTSTRUCT lpps; 
    RECT rc; 
    LPRECT lprc; 
    HGLOBAL hglb; 
    LPSTR lpstr; 
    HBITMAP hbm; 
    HENHMETAFILE hemf; 
    HWND hwndOwner; 
 
    switch (uMsg) 
    { 
        case WM_PAINT: 
            hdc = BeginPaint(hwnd, &ps); 
 
            // Branch depending on the clipboard format. 
 
            switch (uFormat) 
            { 
                case CF_OWNERDISPLAY: 
                    ...
 
                case CF_BITMAP: 
                    hdcMem = CreateCompatibleDC(hdc); 
                    if (hdcMem != NULL) 
                    { 
                        if (OpenClipboard(hwnd)) 
                        { 
                            hbm = (HBITMAP) 
                                GetClipboardData(uFormat); 
                            SelectObject(hdcMem, hbm); 
                            GetClientRect(hwnd, &rc); 
 
                            BitBlt(hdc, 0, 0, rc.right, rc.bottom, 
                                hdcMem, 0, 0, SRCCOPY); 
                            CloseClipboard(); 
                        } 
                        DeleteDC(hdcMem); 
                    } 
                    break; 
...

如果需要将获取的位图对象保存为文件,则必须严格按照BITMAPINFOHEADER structure赋值

MSDN 代码示例:Storing an Image