我的主程序mdi的,弹出了一个模态窗体,这时候我有个自动锁屏,当锁屏的时候我主程序使用了frmMain.Hide;,这时候主程序最小化了,可是似乎模态窗体还在上面,(这里我希望可以让模态的窗体也不显示),然后我输入所平的密码后,则调用frmMain.Show;自动再次显示出来隐藏的主窗体,可是这时候刚才的模态窗体就不在最前方了,导致主程序无法响应任何动作(这里我希望是可以恢复成初始的样子,就是出程序显示,模态窗体也显示并在最前方)
如何解决呢?

解决方案 »

  1.   

    你用Visble属性可以。show和hide是不起作用的
      

  2.   

    我有个另类的方法:
    将你的模态窗口彻底透明化,包括其中的控件。如果你不想让用户乱点时点到其中的控件,那么窗体在透明化后,move到另一个位置,并且甚至可以把窗体的尺寸改小。当用户输入正确后,才再改回来。
      

  3.   

    删除Application窗口,使你的frmMain成为主窗口
      

  4.   

    目前还是两个问题:
    1、hide的时候,模态窗体没有隐藏的问题
    2、重新show的时候模态窗体不再最前方的问题。
    针对第1个问题,我想,是否可以单独对模态窗体发消息隐藏呢?但是如何获得此模态窗体的句柄呢?
    针对第2个问题,我现在可以在主程序中检测是否有模态窗体,能检测出来,但是无法获得句柄。
    有哪位高人指点一下呢?大家一起讨论也行。
      

  5.   

    自己解决了,方法如下:var
      tHandle:HWND;
      function ApplicationHasModalForm:HWND; //找到模态窗体
      var
      i:integer;
      begin
        result:=0;
        for i:=0 to Screen.FormCount-1 do
        begin
          if Screen.Forms[i] is TForm then
          begin
            if fsModal in Screen.Forms[i].FormState then
            begin
              result:=Screen.Forms[i].Handle;
              break;
            end;
          end;
        end;
      end;
    begin……隐藏的时候代码如下
    frmMain.Hide;
    tHandle:=ApplicationHasModalForm;//获得模态窗体句柄
    ShowWindow(tHandle,SW_HIDE); //消息隐藏模态窗体……恢复显示的时候代码如下
    frmMain.Show;
    ShowWindow(tHandle,SW_SHOW);……
    end;