var
  ExistHwnd: Hwnd
begin
  ExistHwnd := FindWindow(PChar('TServiForm'),nil);
  ShowWindow(ExistHwnd,SW_RESTORE);
end;
其中TServiForm是一个已经打开的窗口,执行上面代码后窗口是显示了,但右上角的最小化按钮无效了!

解决方案 »

  1.   

    findwindow获取的应该是form的HANDLE,而你恢复的也是FORM的窗口,但是project的窗口并没有恢复,你可以右键你的菜单栏看看,应该还是最小化的。
    可以用保存application handle来操作
      

  2.   

    “ShowWindow(ExistHwnd,SW_RESTORE);”  这句要看你的上小文,如果之前最小化或者最大化了,运行这个可以恢复。 如果只是想显示,可以用 ShowWindow(ExistHwnd,SW_SHOWNORMAL);, 最大化或者最小化也都有对应的参数。想修改 z-order,可以用 SetWindowPos, 或者 BringWindowToTop。
      

  3.   


    program Project1;uses
      Forms,
      windows,
      Unit1 in 'Unit1.pas' { Form1 } ;Resourcestring
      FMutex = 'Mutex_ONLY_ONE';
    {$R *.RES}var
      hMutex: HWND;
      iRet: integer;
      ExistHwnd: HWND;begin
      Application.Initialize;
      hMutex := CreateMutex(nil, False, PChar(FMutex));
      iRet := GetLastError;
      if iRet <> ERROR_ALREADY_EXISTS then
      begin
        Application.CreateForm(TForm1, Form1);
        Application.Run;
      end
      else
      begin
        ExistHwnd := FindWindow(PChar('TForm1'),nil);
        ShowWindow(ExistHwnd,SW_RESTORE);
      end;  ReleaseMutex(hMutex);
    end.简化了下,写了个测试,意思就是打开了form1就不让打开第二个了,顺便想把已经打开的那个实例激活到windows的最上面,发现的问题是,这样可以把Form1激活,但是Form1的右上角的最小化按钮已经没效了!
      

  4.   

    IsIcon 判断一下窗体是不是最小化了,如果不是,就不要restore,直接 bring to top 
      

  5.   

    不知道我在说什么吗~~
     唉~
      多想下为什么出这种问题啊~
     在ShowWindow(ExistHwnd,SW_RESTORE);之前加上ExistHwnd := GetWindow(ExistHwnd, GW_OWNER);看看
      

  6.   

    GW_OWNER:返回的句柄标识了指定窗口的所有者窗口(如果存在)。
      

  7.   


    这个问题
    其实Borland取巧,TApplication本身就是一个窗口,只是她是不可见的,四围是(0,0,0,0),而且她过滤主窗体的系统消息。所以,你要最小化整个应用程序,应该用Application.Minimize。