尝试将字符串复制到剪贴板时出错

时间:2013-07-20 11:59:14

标签: c# clipboard

我试过这段代码:

Clipboard.SetText("Test!");

我收到了这个错误:

  

在进行OLE调用之前,必须将当前线程设置为单线程单元(STA)模式。确保您的Main功能上标有STAThreadAttribute

我该如何解决?

4 个答案:

答案 0 :(得分:35)

您需要特别调用该方法,因为它使用了一些遗留代码。试试这个:

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

答案 1 :(得分:13)

[STAThread]置于主要方法之上:

[STAThread]
static void Main()
{
}

答案 2 :(得分:3)

您只能从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;
    }
}

答案 3 :(得分:0)

这个问题已经有 8 年了,但许多人仍然需要解决方案。

正如其他人提到的,剪贴板必须从主线程或 [STAThread] 调用。

嗯,我每次都使用这种解决方法。也许它可以是一个替代方案。

public static void SetTheClipboard()
{
    Thread t = new Thread(() => {
        Clipboard.SetText("value in clipboard");
    });

    t.SetApartmentState(ApartmentState.STA);
    t.Start();
    t.Join();

    await Task.Run(() => {
        // use the clipboard here in another thread. Also can be used in another thread in another method.
    });
}

剪贴板值是在 t 线程中创建的。

关键是:线程t单元设置为STA状态。

稍后您可以根据需要在其他线程中使用剪贴板值。

希望你能明白这一点。