web-dev-qa-db-ja.com

文字列をクリップボードにコピーする際の「現在のスレッドをシングルスレッドアパートメント(STA)に設定する必要があります」エラー

C#でデータをクリップボードにコピーする方法 からコードを試しました:

Clipboard.SetText("Test!");

そして、私はこのエラーを受け取ります:

OLE呼び出しを行う前に、現在のスレッドをシングルスレッドアパートメント(STA)モードに設定する必要があります。Main関数にSTAThreadAttributeがマークされていることを確認してください。

どうすれば修正できますか?

19
user1823701

プット[STAThread]メインメソッドの上:

[STAThread]
static void Main()
{
}
13
Thousand

レガシーコードを使用しているため、このメソッドを特別に呼び出す必要があります。これを試して:

Thread thread = new Thread(() => Clipboard.SetText("Test!"));
thread.SetApartmentState(ApartmentState.STA); //Set the thread to STA
thread.Start(); 
thread.Join(); //Wait for the thread to end
36
It'sNotALie.

クリップボードにはSTAThreadからのみアクセスできます。

これを解決する最も簡単な方法は、Main()メソッドの上に[STAThread]を置くことですが、何らかの理由でそれができない場合は、STAThreadセットを作成する別のクラスを使用できます。あなたへの文字列値。

public static class Clipboard
{
    public static void SetText(string p_Text)
    {
        Thread STAThread = new Thread(
            delegate ()
            {
                // Use a fully qualified name for Clipboard otherwise it
                // will end up calling itself.
                System.Windows.Forms.Clipboard.SetText(p_Text);
            });
        STAThread.SetApartmentState(ApartmentState.STA);
        STAThread.Start();
        STAThread.Join();
    }
    public static string GetText()
    {
        string ReturnValue = string.Empty;
        Thread STAThread = new Thread(
            delegate ()
            {
                // Use a fully qualified name for Clipboard otherwise it
                // will end up calling itself.
                ReturnValue = System.Windows.Forms.Clipboard.GetText();
            });
        STAThread.SetApartmentState(ApartmentState.STA);
        STAThread.Start();
        STAThread.Join();

        return ReturnValue;
    }
}
3
GDavoli