主程序中起一个线程 如下
        public static void StartLockSystem()
        {            Thread aThread = new Thread(CheckLockState);
            aThread.IsBackground = true;
            aThread.Start();
        }        public static void CheckLockState()
        {            for (int i = Application.OpenForms.Count - 1; i >= 0; i--)
            {
                Application.OpenForms[i].Hide();
            }
        }为什么在该线程中,弹出窗口是hide不了的。
假如我不调用StartLockSystem,而直接去调用CheckLockState(),弹出窗口就能hide呢?

解决方案 »

  1.   

    在 worker 上操作 UI,必须使用 Invoke 委托。
      

  2.   


    构造函数中添加:
                
    Control.CheckForIllegalCrossThreadCalls = false;
      

  3.   


    private delegate void FlushClient();
    public static void CheckLockState()
    {
    if (Application.OpenForms[i].InvokeRequired)
                    {
                        FlushClient fc = new FlushClient(CheckLockState);
                        this.Invoke(fc);
                    }
                    else
                    {                    for (int i = Application.OpenForms.Count - 1; i >= 0; i--)
      {
      Application.OpenForms[i].Hide();
      }
                    }
    }
      

  4.   

    我在前面加了Application.SetCompatibleTextRenderingDefault(false);这个的。
    我是这个意思:我想把主程序锁定,就是做了一个窗体叫frmLock,当我想锁定的时候,我就把所有的窗体都hide掉,然后showdialog出frmLock。现在的问题是我在做测试的时候发现:
    如下代码都在program.cs里面
    假如我在主窗体里面弹出了一个对话框
    当我在线程里面调用
     public static void LockSystem()
      {            for (int i = Application.OpenForms.Count - 1; i >= 0; i--)
                {
                    Application.OpenForms[i].Hide();
                }            FormLock aFrm = new FormLock();
                aFrm.ShowDialog();
       }
    的时候,按alt+tab就能看见对话框和FormLock;
    当我直接调用LockSystem的时候,就看不见对话框了,只能看见FormLock。
    并且我想问问在program里面怎么写委托
      

  5.   

    假如在主窗体里面做这个锁定,恢复的时候主窗体不能show自己把。
      

  6.   

    我实现锁定主窗体用的是Timer,而不是线程
    而且是写在主窗体中,不是program.cs
      

  7.   


    在主窗体里面恢复锁定的时候show了没反应
      

  8.   

    并且委托到主窗体上也是一样的效果哦,都不能hide掉