How to copy data to clipboard in C# のコードを試しました:
Clipboard.SetText("Test!");
そして、私はこのエラーを受け取ります:
OLE 呼び出しを行う前に、現在のスレッドをシングル スレッド アパートメント (STA) モードに設定する必要があります。
Main
関数がSTAThreadAttribute
マークされていることを確認してください。
どうすれば修正できますか?
How to copy data to clipboard in C# のコードを試しました:
Clipboard.SetText("Test!");
そして、私はこのエラーを受け取ります:
OLE 呼び出しを行う前に、現在のスレッドをシングル スレッド アパートメント (STA) モードに設定する必要があります。
Main
関数がSTAThreadAttribute
マークされていることを確認してください。
どうすれば修正できますか?
スレッドが 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
コードを実行するスレッドが [STAThread] 属性でマークされていることを確認してください。WinForm およびコンソール ベースのアプリの場合、通常はMain
メソッドです。
[STAThread]
メインメソッドの上に置きます:
[STAThread]
static void Main()
{
}
WinForms の場合、通常、生成された Main.cs ファイルにあり、必要に応じて編集できます (変更しても再生成されません)。コンソールの場合は、Main
.
.SetApartmentState(ApartmentState.STA)
スレッドを制御できない場合 (つまり、ライブラリを作成している場合、または何らかの理由でメイン アプリがロックされている場合)は、別の回答に示されているように、特別に構成されたスレッド () でクリップボードにアクセスするコードを代わりに実行できます。
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;
}
}