在可以调用 OLE 之前,必须将当前线程设置为单线程单元(STA)模式。请确保您的 Main

.Net技术 码拜 9年前 (2015-05-10) 2656次浏览 0个评论

public partial class LiemaiMan : Form
    {
        BackgroundWorker m_Worker;// 放在后台执行
        // 用一个标记来看是否请求停止执行       
        bool m_NeedRun = false;
        
        public LiemaiMan()
        {
            InitializeComponent();
            m_Worker = new BackgroundWorker();
            m_Worker.DoWork += new DoWorkEventHandler(m_Worker_DoWork);
        }
private void m_Worker_DoWork(object sender, EventArgs e)
        {
            while (m_NeedRun)
                    for (int i = 1; i <= 12; i++)
                    {
                        Bgop.KeyPress(hwnd, 8);
                    }
                    //备份
                    System.Threading.Thread.Sleep(2000);
                    Clipboard.SetText(this.dataGridView1.Rows[x].Cells[0].Value.ToString());
                    //装弹
                    Bgop.PostMessage(hwnd, 770);
                    //恢复备份d 
                    SendKeys.SendWait(“{TAB}”);
                    System.Type oType = System.Type.GetTypeFromProgID(“WScript.Shell”);
                    object o = System.Activator.CreateInstance(oType);
                    oType.InvokeMember(“SendKeys”, System.Reflection.BindingFlags.InvokeMethod, null, o, new object[] { this.dataGridView1.Rows[x].Cells[1].Value.ToString() });
                    oType.InvokeMember(“SendKeys”, System.Reflection.BindingFlags.InvokeMethod, null, o, new object[] { “{ENTER}” });
                   
  }
 private void button21_Click(object sender, EventArgs e)
        {
            m_NeedRun = true; 
            m_Worker.RunWorkerAsync();
        }
 private void button20_Click(object sender, EventArgs e)
        {
            m_NeedRun = false;
        }    
线程执行到 Clipboard.SetText(this.dataGridView1.Rows[x].Cells[0].Value.ToString());这句就提示在可以调用 OLE 之前,必须将当前线程设置为单线程单元(STA)模式。请确保您的 Main函数带有STAThreadAttribute标记。
见检查已经有[STAThread]
        static void Main()
这该怎么解决啊?各位大侠帮忙看看

引用 楼主 zhaogenxin 的回复:

线程执行到 Clipboard.SetText(this.dataGridView1.Rows[x].Cells[0].Value.ToString());这句就提示在可以调用 OLE 之前,必须将当前线程设置为单线程单元(STA)模式。请确保您的 Main函数带有STAThreadAttribute标记。
见检查已经有[STAThread]
        static void Main()
这该怎么解决啊?各位大侠帮忙看看

在UI主线程执行它就不会有这个提示了,不用盲目照它的提示做。

具体该怎么改啊?能够详细点吗?不是很懂啊

引用 1 楼 sp1234 的回复:
Quote: 引用 楼主 zhaogenxin 的回复:

线程执行到 Clipboard.SetText(this.dataGridView1.Rows[x].Cells[0].Value.ToString());这句就提示在可以调用 OLE 之前,必须将当前线程设置为单线程单元(STA)模式。请确保您的 Main函数带有STAThreadAttribute标记。
见检查已经有[STAThread]
        static void Main()
这该怎么解决啊?各位大侠帮忙看看

在UI主线程执行它就不会有这个提示了,不用盲目照它的提示做。

引用 1 楼 sp1234 的回复:
Quote: 引用 楼主 zhaogenxin 的回复:

线程执行到 Clipboard.SetText(this.dataGridView1.Rows[x].Cells[0].Value.ToString());这句就提示在可以调用 OLE 之前,必须将当前线程设置为单线程单元(STA)模式。请确保您的 Main函数带有STAThreadAttribute标记。
见检查已经有[STAThread]
        static void Main()
这该怎么解决啊?各位大侠帮忙看看

在UI主线程执行它就不会有这个提示了,不用盲目照它的提示做。

具体该怎么做啊?能够详细点吗?不懂

100分
你的操作剪贴板之类的代码不要放在线程中,或者用invoke让UI去做。

CodeBye 版权所有丨如未注明 , 均为原创丨本网站采用BY-NC-SA协议进行授权 , 转载请注明在可以调用 OLE 之前,必须将当前线程设置为单线程单元(STA)模式。请确保您的 Main
喜欢 (0)
[1034331897@qq.com]
分享 (0)

文章评论已关闭!