先做个试验,建一个winform项目,form1里面有button,点击button的代码如下:
 
 private void button1_Click(object sender, EventArgs e)
        {
            Thread p = new Thread(ThreadRun);
            p.Start();                        
        }        private void ThreadRun()
        {
            Form2 x = new Form2();
            x.ShowDialog();
            
        }在form2中有一个textbox, 有趣的是,此时运行这个程序,在form2.textbox中输入中文, 微软2007,2010输入法无法显示选字框,而2003可以。
问题肯定是由于多线程造成的,我想到的方式比较土,但管用, 那就是委托方式,不知道高人有什么折  private void button1_Click(object sender, EventArgs e)
        {
            Thread p = new Thread(ThreadRun);
            p.Start();                        
        }
        private event EventHandler ttt;
        private void ThreadRun()
        {
            ttt(this, new EventArgs());
            
        }
        void Form1_ttt(object sender, EventArgs e)
        {
            if (this.InvokeRequired)
            {
                EventHandler p = new EventHandler(Form1_ttt);
                this.Invoke(p);
            }
            else
            {
                Form2 x = new Form2();
                x.ShowDialog();
            }
        }

解决方案 »

  1.   

    我这里运行正常,没发现这个问题。Win7,微软拼音2007,Office2007。
      

  2.   

    在win7应该没有问题,是xp的BUG, 他输入法的运行机制与win7不同,估计是消息循环造成的
      

  3.   

    又实验了一下谷歌2.7,也没有问题。看来是碰巧了,微软自己打了自己的屁股,不过也难怪,人家已经宣布不支持XP了,XP的BUG也就没必要考虑了。
      

  4.   

    winform没入门,记得所有UI调用都要用Invoke,很烦。
    如果用代码生成的话,这个问题还是好解决的,给每个UI函数生成一个相同原型的代理。