首先看一下现象:
首先,所有Form都是用ShowDialog()方法打开的。
然后,程序需调用外部应用程序,而且希望以模式窗口调用,所以用Process的WaitForExit()方法。
这样,主程序在外部应用程序结束后才会继续执行。但是,外部应用程序运行时可以
1、在任务栏右击,选择弹出菜单的结束项,强关主程序。
2、单击主程序右上角的关闭按钮,强关主程序。由于不允许隐藏主程序序,所以选择了如下方案:
递归调用所有父窗口的如下属性。
(当打开外部应用程序时state为False,关闭时state为False)
form.ControlBox = state;
form.MaximizeBox = state;
form.MinimizeBox = state;
这样一来,用户就不能点到父窗口的相关按钮,右键菜单中也没有了关闭。下面问题就来了:
结束外部应用程序回到主程序后,所有的打开的父窗口的CanFocus属性全部为True!!!
体现为所有窗口都可以选,所有窗口都可以操作!!!
并且,最小化父窗口,将会自动关闭所有的子窗口!!!
不过,所有窗口的父子关系并没有改变。请教各位了。

解决方案 »

  1.   

    顺序如下:
    1、递归改变所有父窗口的属性使之为False
    2、调用外部程序
    3、递归改变所有父窗口的属性使之为Truewaitforexit()在第2步中做
      

  2.   

    我也这么认为,可现在是只要修改父窗口任一属性(绝大多数,Visible属性不会),都会这样。
    如果有其他解决方案也请赐教
      

  3.   

    Win2000 Professional
    窗体就是普通的System.Windows.Forms.Form
    你模式的意思是指什么?
    窗体都是以模式窗口打开的,也就是说不关子窗体是碰不到父窗体的。
      

  4.   

    vs2003 or vs2005?打开的引用程序,这部分用什么写的
      

  5.   

    VS2003,调用的是一个Access程序。
    我跟踪过程序。在“1、递归改变所有父窗口的属性使之为False”之前。
    也就是没有执行form.ControlBox = state;之前,
    Form.CanFocus 为False但就是这句语句执行后
    Form.CanFocus 为True
      

  6.   

    真是见鬼了?
    这个不应该与环境有关吧
    你有MSN吗?
    我的是[email protected].
    谢谢
      

  7.   

    我重新建了一个工程,也是如此。
    其中有两个Form,第一个根据如下代码调第二个
    private void button1_Click(object sender, System.EventArgs e)
    { Form2 fm = new Form2();
    fm.ShowDialog(this);
    }
      

  8.   

    第二个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,false);
    }
      

  9.   

    ChangeFormState代码如下:
    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);
    }
    }
      

  10.   

    你这样设置的父子关系,我用的是mdi没问题。
      

  11.   

    真对不起,我上面的贴错了两个地方。
    第二个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);
    }
      

  12.   

    ChangeFormState代码如下:
    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);
    }
    }
      

  13.   

    你把
    if(ignoreOwner && fm.Owner != null)
    {
    ChangeFormState(fm.Owner,state,ignoreOwner);
    }
    这部分去掉
      

  14.   

    之所以搞出这些麻烦,就是因为用户要求主程序在打开Access时不可以关闭。
    不知道还有没有其他办法。
      

  15.   

    你设标志位来操作,参看
    http://www.syncfusion.com/faq/windowsforms/search/608.aspx
      

  16.   

    sorry!
    应该是这个
    http://www.syncfusion.com/faq/windowsforms/Search/862.aspx