2017-05-26 11 views
5

.Net Core(プラットフォームに依存しない方法で)を使用してクリップボードに何かをコピーすることは可能ですか?.Net Core - クリップボードにコピーしますか?

Clipboardクラスがなく、P/InvokingがWindows以外のオプションではないようです。

+0

のチェックを外す必要があります。通常、.netcoreアプリはWebアプリまたはコンソールアプリです。いずれも、クリップボードの統合を持たない(あなたのWebクライアントはコピー/ペーストを処理するので、クライアントサイドのJavaScriptを使用してそれを行う必要があります)。あなたがUWPアプリを書いているなら、おそらくUWPにクリップボードAPIがありますが、それはクロスプラットフォームではありません。あなたは何を正確に "クリップ"しようとしていますか? –

+1

プラットフォームにとらわれない方法で - いいえ。もちろん、さまざまなプラットフォーム固有の方法で実行できますが、すべてがP/Invokingを必要とするわけではありません。 Linuxの 'xsel'、Macの' pbcopy'/'pbpaste'、Windowsの' clip.exe'はすべて、標準I/Oを使って簡単なテキストを出し入れすることができます。私は、すべての.NET Coreプラットフォームで動作する 'Clipboard'クラスが、ほとんどの優先順位リストでは高くないと推測しています。シンプルなテキスト以外のものは、プラットフォーム固有のものであるため –

+0

@ErikFunkenbuschこの場合、コンソールアプリとプレーンテキストです。私は良い方法があることに同意しますが、この質問のために私は可能なことにのみ関心があります –

答えて

9

クリップボードクラスが不足していますので、近い将来、そのオプションが追加される予定です。それが起こっている間に、ProcessStartInfoでネイティブシェルコマンドを実行することができます。

私はネットコアでnoobのだけど、WindowsやMac上でクリップボードに、この送信するためのコードや文字列を作成します。クラス
ベース

OS検出クラス

public static class OperatingSystem 
{ 
    public static bool IsWindows() => 
     RuntimeInformation.IsOSPlatform(OSPlatform.Windows); 

    public static bool IsMacOS() => 
     RuntimeInformation.IsOSPlatform(OSPlatform.OSX); 

    public static bool IsLinux() => 
     RuntimeInformation.IsOSPlatform(OSPlatform.Linux); 
} 

シェルon https://loune.net/2017/06/running-shell-bash-commands-in-net-core/

public static class Shell 
{ 
    public static string Bash(this string cmd) 
    { 
     var escapedArgs = cmd.Replace("\"", "\\\""); 
     string result = Run("/bin/bash", $"-c \"{escapedArgs}\""); 
     return result; 
    } 

    public static string Bat(this string cmd) 
    { 
     var escapedArgs = cmd.Replace("\"", "\\\""); 
     string result = Run("cmd.exe", $"/c \"{escapedArgs}\""); 
     return result; 
    } 

    private static string Run (string filename, string arguments){ 
     var process = new Process() 
     { 
      StartInfo = new ProcessStartInfo 
      { 
       FileName = filename, 
       Arguments = arguments, 
       RedirectStandardOutput = true, 
       UseShellExecute = false, 
       CreateNoWindow = false, 
      } 
     }; 
     process.Start(); 
     string result = process.StandardOutput.ReadToEnd(); 
     process.WaitForExit(); 
     return result; 
    } 
} 

クリップボードクラス

public static class Clipboard 
{ 
    public static void Copy(string val) 
    { 
     if (OperatingSystem.IsWindows()) 
     { 
      $"echo {val} | clip".Bat(); 
     } 

     if (OperatingSystem.IsMacOS()) 
     { 
      $"echo \"{val}\" | pbcopy".Bash(); 
     } 
    } 
} 

はその後最後に、あなたがクリップボードにコピーを呼び出すことができますし、クリップボードに値を得ることができます。

var dirPath = @"C:\MyPath"; 
Clipboard.Copy(dirPath); 

他人に役立つことを願っています!改善は大歓迎です。

私は、これらすべてのものを持つ.netコアのToolBoxライブラリで作業しています:https://github.com/deinsoftware/toolbox(NuGetパッケージとしても利用可能)。

+0

私はこの一般的な解決策が本当に好きです。非常に大きなテキストスニペットでは、cmd.exeが一定のサイズを超えてデータを受け付けないために、動作しないようです。他の方法でWindowsクリップボードに何かを得るための任意のアイデア? –

1

私はまだ称賛することはできませんので、私は、答えとしてこれを投稿 が、実際にそれがEquimanのソリューションのほんの強化です:

彼の解決策は素晴らしい作品ではなく、複数行のテキストのための

それはテキストのすべての行を保持するように変更コピー方法と、一時ファイルで動作します:

public static void Copy(string val) 
{ 
    string[] lines = val.Split('\n'); 
    if (lines.Length == 0) 
     $"echo {val} | clip".Bat(); 
    else 
    { 
     StringBuilder output = new StringBuilder(); 

     foreach(string line in lines) 
     { 
      string text = line.Trim(); 
      if (!string.IsNullOrWhiteSpace(text)) 
      { 
       output.AppendLine(text); 
      } 
     } 

     string tempFile = @"D:\tempClipboard.txt"; 

     File.WriteAllText(tempFile, output.ToString()); 
     $"type { tempFile } | clip".Bat(); 

    } 
} 

注:あなたは私の例のように固定の一時ファイルを使用しないようにコードを向上させる、またはパスを変更する場合があります。

この解決策はWindowsで動作しますが、Mac/Linuxなどについてはわかりませんが、原則は他のシステムにも適用する必要があります。 私が覚えている限り、Linuxでは "type"を "cat"に置き換える必要があります。

私の解決策はWindows上でのみ実行する必要があるため、詳細は調査しませんでした。

上記のコードをWindows用に使用する場合、一時ファイルのパスにはスペースを入れないでください。

あなたが同様にクリップボードにコピーして空白行を維持したい場合は、 あなたは私がここでのユースケースで少し混乱している「string.IsNullOrWhiteSpace」

関連する問題