Fazer que um form ocupe espaço tipo barra de tarefas

Delphi

08/07/2007

Pessoal eu estou tentando fazer com que um form no formato parecido com uma barra de tarefas do windows ocupe um espaço no rodapé do form (acima da barra de tarefas do windows) , e faça com que ao maximizar os outros programas o rodapé dos programas fique logo acima desse meu form ou seja limitando o tamanho do desktop fazendo com que esse form fique sempre a vista sem esconder os rodapés dos outros forms.

Agradeço desde já
Atenciosamente Vitor Araújo Alcântara


Vitor Alcantara

Vitor Alcantara

Curtidas 0

Respostas

Vitor Alcantara

Vitor Alcantara

08/07/2007

Pessoal eu consegui resolver o meu problema da seguinte forma:

Primeiro eu listei todos os formes abertos e joguei dentro de uma StringList com essa função:
Function EnumWindowsProc (Wnd: HWND; lb: TStringList): BOOL; stdcall;
  var caption: Array [0..128] of Char;
begin
  Result := True;
  if IsWindowVisible(Wnd) and
  ((GetWindowLong(Wnd, GWL_HWNDPARENT) = 0) or
  (HWND(GetWindowLong(Wnd, GWL_HWNDPARENT)) =   GetDesktopWindow))and
  ((GetWindowLong(Wnd, GWL_EXSTYLE) and WS_EX_TOOLWINDOW) = 0)
  then
  begin
    SendMessage( Wnd, WM_GETTEXT, Sizeof(caption),integer(@caption));
    lb.Add ( caption);
  end;
end;


Dai eu coloquei um timer no meu form com essa rotina:

procedure TFormMenu.Timer1Timer(Sender: TObject);
var
  hnd : Thandle;
  wndHandle : THandle;
  wndClass : array[0..50] of Char;
  r,r1:TRect;
  x:integer;
begin
  ls.Clear;
  //Pega o handle e o rect da Barra de tarefas
  StrPCopy(@wndClass[0],´Shell_TrayWnd´);
  wndHandle := FindWindow(@wndClass[0], nil);
  GetWindowRect(wndHandle,r1);

  //Coloca as aplicações dentro da string list
  EnumWindows( @EnumWindowsProc, integer( ls ));
  for x := 0 to Ls.Count - 1 do
  begin
    //Pega o Handle e o rect do form do programa
    hnd := FindWindow(nil,pchar(ls.Strings[x]));
    GetWindowRect(hnd,r);

    
    if Hnd > 0 then
    //Verifica se está maximizado   
    if isZoomed(hnd) then
    begin
      {Form está maximizado}
      if r.Bottom <>  r1.Top    - Height then
      SetWindowPos(hnd,HWND_TOP,0,0,iW , r1.Top    - Height,SWP_SHOWWINDOW);
    end
    { Form1 está maximizado }
    else
    begin

    end
  end;
end;


Aonde iW é uma váriavel do tipo integer onde eu passo o tamanho horizontal da minha tela e Ls é uma váriavel do tipo TStringList onde eu passo as aplicações abertas do windows.

procedure TFormMenu.FormCreate(Sender: TObject);
begin
  ls := TStringList.Create;

  iW := Screen.Width;
  iH := Screen.Height;
end;


Desse modo eu consegui que as aplicações maximizadas fiquem sempre acima do meu form, fazendo como se o meu form oculpasse o espaço da barra de tarefas.

Lembrando que no meu caso o meu form é tem alinhamento do tipo ´alBottom´.

Ainda não consegui fazer com que os ícones dos atalhos do desktop se organizem somente acima do meu form. Se alguem ai souber ou tiver alguma sugestão de como fazer isso coloca aqui.


GOSTEI 0
POSTAR