在任务管理器里通过右键菜单使“应用程序”里delphi创建的程序最大化,主窗口的大小不变,但主窗口后面出现了一个大窗口覆盖了整个桌面,请问怎么解决这个问题。随便做一个delphi程序就能重现这个问题。

解决方案 »

  1.   

    这是由于Delphi创建的程序真正的主窗体是Application自动建立的一个隐藏窗口。
      

  2.   

    你应该是改动了Forms的源码,把这两句话注释掉了
        DeleteMenu(SysMenu, SC_MAXIMIZE, MF_BYCOMMAND);
        DeleteMenu(SysMenu, SC_SIZE, MF_BYCOMMAND);
      

  3.   

    我没有改动forms的源码,“DeleteMenu(SysMenu, SC_MAXIMIZE, MF_BYCOMMAND);DeleteMenu(SysMenu, SC_SIZE, MF_BYCOMMAND);”这两句都还在。请问有人知道怎么解决这个问题吗?
      

  4.   

    你可以设置Application.OnMessage事件处理,检测IsZoomed(Application.Handle),如果是最大化,把它恢复,并把Application.MainForm最大化。
    但是也不是很完美,至少第一次还会看到那个空窗口闪一下。
      

  5.   

    这确是VCL考虑不周的地方,下面的方法可以解决,但是,效果不好,会有两次最大化的动画:
    procedure TForm1.FormDestroy(Sender: TObject);
    begin
      Application.UnhookMainWindow(WindowHook);
    end;procedure TForm1.FormCreate(Sender: TObject);
    begin
      Application.HookMainWindow(WindowHook);
    end;function TForm1.WindowHook(var Message: TMessage): Boolean;
    begin
      Result := False;
      if Message.Msg = WM_SIZE then
      begin
        case Message.WParam of
          SIZE_MAXIMIZED:
            begin
              ShowWindow(Application.Handle, SW_RESTORE);
              ShowWindow(Application.MainForm.Handle, SW_MAXIMIZE);
              Result := True;
            end;
        end;
      end
    end;
      

  6.   

    另一个解决办法,就是将Application隐藏掉,任务栏上显示的是真正的窗体本身。
    但这个也是非常麻烦,会遇到很多问题。
      

  7.   

    这个问题有比较复杂的解决方法,详情参考这一篇文章,虽然是讲Vista开发的,却解决了你遇到的问题。http://bdn.borland.com/article/33743英文的,不过不是很难理解。