c# - C# 控制台应用程序中剪贴板的奇怪行为

标签 c# .net winforms console clipboard

考虑这个小程序:

class Program
{
    [STAThread]
    static void Main(string[] args)
    {
        Console.WriteLine("Please copy something into the clipboard.");
        WaitForClipboardChange();
        Console.WriteLine("You copied " + Clipboard.GetText());
        Console.ReadKey();
    }

    static void WaitForClipboardChange()
    {
        Clipboard.SetText("xxPlaceholderxx");
        while (Clipboard.GetText() == "xxPlaceholderxx" && 
               Clipboard.GetText().Trim() != "")
            Thread.Sleep(90);
    }
}

我运行它,然后从记事本中复制一个字符串。但是程序只是从剪贴板中获取一个空字符串并写入“你复制了”。

这里有什么问题?在控制台应用程序中,是否存在导致剪贴板访问行为异常的原因?

这是 Windows 7 SP1 x86、.NET 4 客户端配置文件。

最佳答案

使用这个函数

static string GetMeText()
  {
     string res = "starting value";
     Thread staThread = new Thread(x => 
       {
         try
         {
             res = Clipboard.GetText();
         }
         catch (Exception ex) 
         {
            res = ex.Message;            
         }
       });
    staThread.SetApartmentState(ApartmentState.STA);
    staThread.Start();
    staThread.Join();
    return res;
  }

在这一行中:

  Console.WriteLine("You copied " + Clipboard.GetMeText());

问题是剪贴板仅适用于某些线程模型 (ApartmentState.STA),因此您必须创建一个新线程并为其提供此代码执行该操作的模型。

关于c# - C# 控制台应用程序中剪贴板的奇怪行为,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20407114/

相关文章:

c# - 如何检测文件不是 ANSI-Latin1?

c# - 应用程序显示两个菜单条而不是一个

c# - 在命令提示符下运行的命令在 C# 中不起作用

c# - 任务在应该完成的时候一直循环

.net - 如何微调 FluentNHibernate 的自动映射器?

c# - 如何加速 .NET 客户端应用程序(Windows 窗体或 WPF)的初始化?

c# - 客户端的 WCF 服务 - SSL 证书

c# - Nuget SQL Compact,可部署程序集

.net - Windows 资源管理器在哪里存储文件元数据?

c# - 用户事件记录、遥测(和全局异常处理程序中的变量)