25

How to copy data to clipboard in C# のコードを試しました:

Clipboard.SetText("Test!");

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

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

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

4

4 に答える 4

51

スレッドが STA モードで実行されるかどうかを制御できない場合 (つまり、テスト、他のアプリへのプラグイン、またはその呼び出しをランダムに送信して非 UI スレッドで実行するコードのみControl.Invoke)メイン UI スレッド) よりも、クリップボード アクセスにSTA必要な状態になるように特別に構成されたスレッド (実際には STA を必要とする OLE を内部的に使用する) でクリップボード アクセスを実行できます。

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
于 2013-07-20T12:01:23.937 に答える
19

コードを実行するスレッドが [STAThread] 属性でマークされていることを確認してください。WinForm およびコンソール ベースのアプリの場合、通常はMainメソッドです。

[STAThread]メインメソッドの上に置きます:

[STAThread]
static void Main()
{
}

WinForms の場合、通常、生成された Main.cs ファイルにあり、必要に応じて編集できます (変更しても再生成されません)。コンソールの場合は、Main.

.SetApartmentState(ApartmentState.STA)スレッドを制御できない場合 (つまり、ライブラリを作成している場合、または何らかの理由でメイン アプリがロックされている場合)は、別の回答に示されているように、特別に構成されたスレッド () でクリップボードにアクセスするコードを代わりに実行できます。

于 2013-07-20T12:01:16.733 に答える
12

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

[STAThread]これを解決する最も簡単な方法は、メソッドの上に置くMain()ことですが、何らかの理由でそれができない場合は、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;
    }
}
于 2018-07-05T08:18:16.943 に答える