C#でデータをクリップボードにコピーする方法


回答:


798

異なるアセンブリと異なる名前空間に存在する2つのクラスがあります。

  • WinForms:次の名前空間宣言を使用Main[STAThread]ます。属性がマークされていることを確認してください:

    using System.Windows.Forms;
  • WPF:次の名前空間宣言を使用します

    using System.Windows;
  • コンソール:への参照を追加しSystem.Windows.Forms、次の名前空間宣言を使用して、属性Mainでマークされていることを確認し[STAThread]ます。別の回答のステップバイステップガイド

    using System.Windows.Forms;

正確な文字列(この場合はリテラル)をコピーするには:

Clipboard.SetText("Hello, clipboard");

テキストボックスの内容をコピーするには、TextBox.Copy()を使用するか、最初にテキストを取得してから、クリップボードの値を設定します。

Clipboard.SetText(txtClipboard.Text);

例については、こちらをご覧ください。または... MSDNの公式ドキュメントまたはWPFのこちら


備考:


@KierenJohnstoneキーと値のペアを使用してクリップボードのコンテンツにアクセスすることは可能ですか?
Abdul

@アブドゥル-どういう意味かわかりません。クリップボードの内容は、テキスト、ファイル、画像、あらゆる種類のカスタムデータです。kvペアの概念は、クリップボードのアイデアとは何の関係もないように思われますか?
Kieren Johnstone

@KierenJohnstone私が作ろうとしているのは、ユーザーがクリップボードに複数のものを保存できるものです。これらのものはキーによってアクセスされます。HTML5ローカルストレージに似ています。または、クリップボードの性質上、そのようなことは不可能ですか?
Abdul

ASP.NETでエラーが発生した場合は、新しいスレッドを使用してみてください。var thread = new Thread(param => {Clipboard.SetText(txtName.Text);}); thread.SetApartmentState(ApartmentState.STA); thread.Start();
user3790692 2016年

1
skia.heliouの回答が役に立ちました:属性[STAThreadAttribute]を追加した後、Clipboard.SetTextメソッドが機能し始めます
viteo

44

以下のためのコンソールステップ・バイ・ステップ方式でプロジェクトには、最初に追加する必要がありますSystem.Windows.Forms参照を。以下の手順は、.NET 4.5を使用するVisual Studio Community 2013で機能します。

  1. ソリューションエクスプローラ、お使いのコンソールプロジェクトを展開します。
  2. [ 参照 ]を右クリックし、[ 参照の追加... ] クリックします
  3. [ アセンブリ]グループの[ フレームワーク]で、を選択しますSystem.Windows.Forms
  4. OKをクリックします。

次に、次のusingステートメントをコードの先頭にある他のステートメントとともに追加します。

using System.Windows.Forms;

次に、次のいずれかを追加しますClipboardSetTextコードへのステートメント:

Clipboard.SetText("hello");
// OR
Clipboard.SetText(helloString);

最後に、次のようにメソッドに追加STAThreadAttributeしてMain、を回避しSystem.Threading.ThreadStateExceptionます。

[STAThreadAttribute]
static void Main(string[] args)
{
  // ...
}

1
このクラスは、.NET FrameworkシステムクラスライブラリのStackOverflowException直前STAThreadAttributeにあります=)
skia.heliou

42

クリップボードへのWPF C#の対処を使用したこの問題の私の経験とSystem.Threading.ThreadStateException、すべてのブラウザーで正しく機能する私のコードがここにあります:

Thread thread = new Thread(() => Clipboard.SetText("String to be copied to clipboard"));
thread.SetApartmentState(ApartmentState.STA); //Set the thread to STA
thread.Start(); 
thread.Join();

この投稿のクレジットはこちら

ただし、これはlocalhostでのみ機能するため、サーバーでは機能しないため、試さないでください。

サーバー側では、を使用してそれを行いましたzeroclipboard。多くの研究の後、唯一の方法です。


自動化されたSeleniumテスト(webdriver)で使用しましたが、うまく機能します!
andrew.fox 2017年

@ andrew.foxあなたはあなたのサーバークライアントモデルでそれを試しましたか?それが2つの別々のマシンであるなら、私はそれがうまくいかないはずだと思うので。
BMaximus 2017年

いいえ、Seleniumはエージェントマシンのブラウザウィンドウを開きます。
andrew.fox 2017年


1

Clip.exeは、クリップボードを設定するためのWindowsの実行可能ファイルです。これはWindows 以外のオペレーティングシステムでは機能しないことに注意しください

        /// <summary>
        /// Sets clipboard to value.
        /// </summary>
        /// <param name="value">String to set the clipboard to.</param>
        public static void SetClipboard(string value)
        {
            if (value == null)
                throw new ArgumentNullException("Attempt to set clipboard with null");

            Process clipboardExecutable = new Process(); 
            clipboardExecutable.StartInfo = new ProcessStartInfo // Creates the process
            {
                RedirectStandardInput = true,
                FileName = @"clip", 
            };
            clipboardExecutable.Start();

            clipboardExecutable.StandardInput.Write(value); // CLIP uses STDIN as input.
            // When we are done writing all the string, close it so clip doesn't wait and get stuck
            clipboardExecutable.StandardInput.Close(); 

            return;
        }
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.