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;
}
}