c#利用线程访问剪切板,不加线程的时候可以得到剪切板的值,但是加了线程message = Convert.ToString(Clipboard.GetDataObject().GetData(DataFormats.Text));抛出异常提示没有对对象进行实例化
 private void button1_Click(object sender, EventArgs e)
        {
            getexc();
            //Thread th = new Thread(new ThreadStart(getexc));
            //th.IsBackground = true;
            //th.Start();
            //Thread.Sleep(100);
        }        public void getexc()
        {
            try
            {
                ParenthWnd = FindWindow(null, name);
                string message = string.Empty;
                if (!ParenthWnd.Equals(IntPtr.Zero))
                {
                    SetForegroundWindow(ParenthWnd);
                    keybd_event((byte)Keys.ControlKey, 0, 0, 0);
                    keybd_event((byte)Keys.C, 0, 0, 0);
                    keybd_event((byte)Keys.C, 0, 2, 0);
                    keybd_event((byte)Keys.ControlKey, 0, 2, 0);
                    message = Convert.ToString(Clipboard.GetDataObject().GetData(DataFormats.Text));
                }
                if (!string.IsNullOrEmpty(message))
                {
                    SetForegroundWindow(this.Handle);
                    Thread.Sleep(1000);
                }

解决方案 »

  1.   

    因为关系到加载一些数据,而剪切板里面是一些规则的excel复制的内容,最后要和库里面一起加载,导致程序假死一段时间,所以想加个线程避免程序假死
      

  2.   

    Clipboard对象是否为空,或者有一种可能是线程中无法访问DataFormats.Text,或访问不到这个控件的值。我觉得不一定非要从剪切板里读取,如果是能直接读excel流用datatable保存不知可以否?
      

  3.   

    Clipboard.GetDataObject().GetData(DataFormats.Text)其实可以用Clipboard.GetText()来代替的呀,你改下,就不会出现为空的情况了。
    楼上搞什么飞机,DataFormats.Text是个枚举值,怎么可能在其它线程中无法访问,好好回家看看书吧。
      

  4.   

     Thread th = new Thread(new ThreadStart(getexc));
      th.IsBackground = true;
       th.SetApartmentState(ApartmentState.STA);
      th.Start();
      Thread.Sleep(100);
      

  5.   

    额 Clipboard 都是在 winfrom 或者是 WPF 之类的UI 中定义的
    而所有的UI操作必须是单线程的...
    虽然我还不清楚 剪贴 跟UI有什么关系, 不过既然放在了 WinForm 里面, 肯定是有联系的吧...