EMF/WMF形式のイメージをクリップボードに入れたい
クリップボードにテキストやビットマップイメージをコピーするのは、Clipboardクラスを使うと簡単にできます。
例: Clipboard.SetText("コピーする文字列");
しかし、EMF/WMF形式のイメージの場合には、この方法は使えません。背後で使用している.NET FrameworkのDataObjectクラスがEMF/WMFをサポートしていないためです。
回避するには、以下の例のようにWindows Native API を使う必要があります。
public const int CF_ENHMETAFILE = 14;
[DllImport("user32.dll", SetLastError = true)]
public static extern bool OpenClipboard(IntPtr hWndNewOwner);
[DllImport("user32.dll", SetLastError = true)]
public static extern bool CloseClipboard();
[DllImport("user32.dll")]
public static extern bool EmptyClipboard();
[DllImport("user32.dll")]
public static extern IntPtr SetClipboardData(uint uFormat, IntPtr obj);
[DllImport("user32.dll")]
public static extern IntPtr GetClipboardData(uint uFormat);
private void copyToClipboard(Metafile meta)
{
IntPtr hMeta = meta.GetHenhmetafile();
if (NativeMethods.OpenClipboard(IntPtr.Zero))
{
NativeMethods.EmptyClipboard();
NativeMethods.SetClipboardData(NativeMethods.CF_ENHMETAFILE, hMeta);
NativeMethods.CloseClipboard();
}
}