首先看一下现象:
首先,所有Form都是用ShowDialog()方法打开的。
然后,程序需调用外部应用程序,而且希望以模式窗口调用,所以用Process的WaitForExit()方法。
这样,主程序在外部应用程序结束后才会继续执行。但是,外部应用程序运行时可以
1、在任务栏右击,选择弹出菜单的结束项,强关主程序。
2、单击主程序右上角的关闭按钮,强关主程序。由于不允许隐藏主程序序,所以选择了如下方案:
递归调用所有父窗口的如下属性。
(当打开外部应用程序时state为False,关闭时state为False)
form.ControlBox = state;
form.MaximizeBox = state;
form.MinimizeBox = state;
这样一来,用户就不能点到父窗口的相关按钮,右键菜单中也没有了关闭。下面问题就来了:
结束外部应用程序回到主程序后,所有的打开的父窗口的CanFocus属性全部为True!!!
体现为所有窗口都可以选,所有窗口都可以操作!!!
并且,最小化父窗口,将会自动关闭所有的子窗口!!!
不过,所有窗口的父子关系并没有改变。请教各位了。
首先,所有Form都是用ShowDialog()方法打开的。
然后,程序需调用外部应用程序,而且希望以模式窗口调用,所以用Process的WaitForExit()方法。
这样,主程序在外部应用程序结束后才会继续执行。但是,外部应用程序运行时可以
1、在任务栏右击,选择弹出菜单的结束项,强关主程序。
2、单击主程序右上角的关闭按钮,强关主程序。由于不允许隐藏主程序序,所以选择了如下方案:
递归调用所有父窗口的如下属性。
(当打开外部应用程序时state为False,关闭时state为False)
form.ControlBox = state;
form.MaximizeBox = state;
form.MinimizeBox = state;
这样一来,用户就不能点到父窗口的相关按钮,右键菜单中也没有了关闭。下面问题就来了:
结束外部应用程序回到主程序后,所有的打开的父窗口的CanFocus属性全部为True!!!
体现为所有窗口都可以选,所有窗口都可以操作!!!
并且,最小化父窗口,将会自动关闭所有的子窗口!!!
不过,所有窗口的父子关系并没有改变。请教各位了。
1、递归改变所有父窗口的属性使之为False
2、调用外部程序
3、递归改变所有父窗口的属性使之为Truewaitforexit()在第2步中做
如果有其他解决方案也请赐教
窗体就是普通的System.Windows.Forms.Form
你模式的意思是指什么?
窗体都是以模式窗口打开的,也就是说不关子窗体是碰不到父窗体的。
我跟踪过程序。在“1、递归改变所有父窗口的属性使之为False”之前。
也就是没有执行form.ControlBox = state;之前,
Form.CanFocus 为False但就是这句语句执行后
Form.CanFocus 为True
这个不应该与环境有关吧
你有MSN吗?
我的是[email protected].
谢谢
其中有两个Form,第一个根据如下代码调第二个
private void button1_Click(object sender, System.EventArgs e)
{ Form2 fm = new Form2();
fm.ShowDialog(this);
}
private void button1_Click(object sender, System.EventArgs e)
{
ChangeFormState(this,false,true); string fileName = @"D:\test1.xls";
Process process = new Process();
process.StartInfo.FileName = fileName;
process.Start();
process.WaitForExit(); ChangeFormState(this,true,false);
}
void ChangeFormState(System.Windows.Forms.Form fm,bool state,bool ignoreOwner)
{
fm.ControlBox = state;
fm.MaximizeBox = state;
fm.MinimizeBox = state; if(!ignoreOwner && fm.Owner != null)
{
ChangeFormState(fm.Owner,state,ignoreOwner);
}
}
第二个Form如下调外部应用程序
private void button1_Click(object sender, System.EventArgs e)
{
ChangeFormState(this,false,true); string fileName = @"D:\test1.xls";
Process process = new Process();
process.StartInfo.FileName = fileName;
process.Start();
process.WaitForExit(); ChangeFormState(this,true,true);
}
void ChangeFormState(System.Windows.Forms.Form fm,bool state,bool ignoreOwner)
{
fm.ControlBox = state;
fm.MaximizeBox = state;
fm.MinimizeBox = state; if(ignoreOwner && fm.Owner != null)
{
ChangeFormState(fm.Owner,state,ignoreOwner);
}
}
if(ignoreOwner && fm.Owner != null)
{
ChangeFormState(fm.Owner,state,ignoreOwner);
}
这部分去掉
不知道还有没有其他办法。
http://www.syncfusion.com/faq/windowsforms/search/608.aspx
应该是这个
http://www.syncfusion.com/faq/windowsforms/Search/862.aspx