主程序中起一个线程 如下
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呢?
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呢?
构造函数中添加:
Control.CheckForIllegalCrossThreadCalls = false;
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();
}
}
}
我是这个意思:我想把主程序锁定,就是做了一个窗体叫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里面怎么写委托
而且是写在主窗体中,不是program.cs
在主窗体里面恢复锁定的时候show了没反应