我想实现像WIN98的“桌面”按钮一样,可以将桌面上所有的程序最小化,显示出桌面来。
我用了下面这些方法,可是都不能成功:
 DeskHandle := GetDesktopWindow;
 BringWindowToTop(DeskHandle);
或: SetForegroundWindow(DeskHandle);
或: SetWindowPos(DeskHandle,HWND_TOP,0,0,800,600,SWP_SHOWWINDOW);
或: showWindow(DeskHandle,SW_SHOWMAXIMIZED);如果依次将最前面的窗口最小化,则速度慢,效果也差,任务条有闪烁感,请问还有什么好办法?

解决方案 »

  1.   

    uses ComObj;
    ...
      App := CreateOleObject('Shell.Application');
      App.MinimizeAll;
      App := NULL;
      

  2.   

    procedure TForm1.Button1Click(Sender: TObject);
    var h:HWnd;
    begin
      h:=handle;
      while h > 0 do
      begin
        if IsWindowVisible(h) then
        Postmessage(h,WM_SYSCOMMAND,SC_MINIMIZE,0);
        h:=GetnextWindow(h,GW_HWNDNEXT);
      end;
    end;
      

  3.   

    procedure TForm1.Button1Click(Sender: TObject);//显示所有
    var h:HWnd;
    begin
      h:=handle;
      while h > 0 do
      begin
        if IsWindowVisible(h) then
        Postmessage(h,WM_SYSCOMMAND,SC_restore,0);
        h:=GetnextWindow(h,GW_HWNDNEXT);
      end;
    end;
      

  4.   

    海浪的方法,对于MSDN.net有点问题,我试验了一下,不知道为什么出现了毛病。
      

  5.   

    westfly(西翔)的方法,思路是对的,可惜,Delphi中没有Shell接口的定义,需要引入,或者自己写定义,在VB里面倒是很好用的。
      

  6.   

    海浪的方法不错,可是在最小化类似DELPHI这种多窗口程序时会出现有些小窗口(如Object Inspcter)无法恢复的问题,而且WINDOWS的任务栏有时也会缩小,我把程序改成下面的样子,就可以了:
     TaskHandle := FindWindow(Pchar('Shell_TrayWnd'), nil);
     h:=GetTopWindow(0);
      while h > 0 do  begin
       if (IsWindowVisible(h)) and (h<>TaskHandle) then begin
         own_window:=Getwindow(h,GW_OWNER);
         if own_window<>0 then h:=own_Window;
         Postmessage(h,WM_SYSCOMMAND,SC_MINIMIZE,0);
       end;
       h:=GetnextWindow(h,GW_HWNDNEXT);
      end;
    西翔的方法确实不能直接创建SHELL对象。