如何使用 win32 将磁盘中的图片复制到剪贴板?

How to copy a picture from disk into the clipboard with win32?

用win32复制文本到剪贴板很容易API,但我想从磁盘(例如D:\1.jpg)复制一张图片到剪贴板

我搜索了很多网页,但找不到有用的东西。 请教我怎么做。

而且没有 MFC。

可以使用Gdi+加载图片,获取HBITMAP,设置剪贴板数据。 Gdi+ 仅支持 Unicode,因此如果使用旧的 ANSI 函数,您必须将文件名转换为宽字符。 C++ 中的示例:

bool copyimage(const wchar_t* filename)
{
    bool result = false;
    Gdiplus::Bitmap *gdibmp = Gdiplus::Bitmap::FromFile(filename);
    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;
}

请注意,Microsoft 建议使用 CF_DIB 设置位图剪贴板数据,但这不适用于 GDI+。此示例使用 CF_BITMAP 代替。

Gdi+ 使用标准 GdiPlus.lib 库。需要初始化如下:

#include <Windows.h>
#include <GdiPlus.h>

#pragma comment(lib, "GdiPlus")//Visual Studio specific

bool copyimage(const wchar_t* filename);

int main()
{
    //initialize Gdiplus once:
    Gdiplus::GdiplusStartupInput gdiplusStartupInput;
    ULONG_PTR gdiplusToken;
    Gdiplus::GdiplusStartup(&gdiplusToken, &gdiplusStartupInput, NULL);

    copyimage(L"d:\1.jpg");

    Gdiplus::GdiplusShutdown(gdiplusToken);
}