PowerShellでemf 形式の画像ファイルをクリップボードに コピーする

2024年9月13日

手こずったのですが 参考 URL を見て作ることができました

バッチファイル

ドラッグアンドドロップやパッチファイルの引数指定可能です

echo e %*
@powershell -Command  "& (Invoke-Expression -Command ('{' + (Get-Content %~f0 | Where-Object {$_.readcount -gt 3}| Out-String )+ '}'))" %*
timeout /t 5&goto:eof


# C# コード部分を定義
$cSource = @'
using System;
using System.Drawing.Imaging;
using System.Runtime.InteropServices;

public class ClipboardHelper
{
    private const int CF_ENHMETAFILE = 14;

    [DllImport("user32.dll")]
    private static extern bool OpenClipboard(IntPtr hWndNewOwner);

    [DllImport("user32.dll")]
    private static extern bool EmptyClipboard();

    [DllImport("user32.dll")]
    private static extern IntPtr SetClipboardData(int uFormat, IntPtr hWnd);

    [DllImport("user32.dll")]
    private static extern int CloseClipboard();

    public static void SetEmfToClipboard(string path)
    {
        using (Metafile metaFile = new Metafile(path))
        {
            // メタファイルのハンドルを取得
            IntPtr hMetaFile = metaFile.GetHenhmetafile();

            // クリップボードを開く
            OpenClipboard(IntPtr.Zero);

            // クリップボードを空にする
            EmptyClipboard();

            // EMF ファイルをクリップボードに設定
            SetClipboardData(CF_ENHMETAFILE, hMetaFile);

            // クリップボードを閉じる
            CloseClipboard();
        }
    }
}
'@
Write-Host $Args[0]

# EMFファイルのパス
$emfPath = 'D:\app2\VSCode\svg\a.emf'
$emfPath = $Args[0]

# C# クラスをPowerShellに組み込む
Add-Type -TypeDefinition $cSource -ReferencedAssemblies System.Drawing,System.Windows.Forms

# EMFファイルをクリップボードに設定
[ClipboardHelper]::SetEmfToClipboard($emfPath)

# メッセージを表示

Write-Host "EMFファイルがクリップボードにコピーされました。"

# スクリプトが終了する前に待機
Start-Sleep -s 5

参考

EMFファイルをクリップボードにコピー – TiBra Blog (tiblab.net)

bat,PowerShell ,windows

Posted by eightban