Jak umieścić aplikacje powyżej Paska Menu START (taskbar)

jas_dream

Problem
Umieszczenie stworzonej przez nas aplikacji powyżej Paska zadań "Menu START" (taskbar) w systemie Windows.

Rozwiązanie:
Poniższy kod po pierwsze tworzy przestrzeń na naszą aplikacje obok Menu START oraz przesuwa nasz program do pozycji nad paskiem.

Aplikacja powinna mieć gdzieś tak do 90 wartości form1.Height (wysokość) a wartość Width (szerokość) - powinno być tak szerokie jak rozdzielczość systemu (np. przy 1024/768 wartość ta powinna mieć 1024)
W Object Inspector dla formy najlepiej ustawić:

  • FormStyle na fsStayOnTop //okno będzie zawsze aktywne
  • BorderStyle na bsNone // bez pasku tytułowego

Kod:

uses shellapi;

...

var
 AppData: TAppBarData;

....

// funkcja - znajdź pasek Menu Start
function FindTaskBar(var ARect: TRect): Integer;
var
	AppData: TAppBarData;
begin
  // 'Shell_TrayWnd' jest nazwą okna pasku
  AppData.Hwnd := FindWindow('Shell_TrayWnd', nil);
  if AppData.Hwnd = 0 then
    RaiseLastWin32Error;
  AppData.cbSize := SizeOf(TAppBarData);
  // SHAppBarMessage zwróci wartość (0) jeżeli pojawi się błąd
  if SHAppBarMessage(ABM_GETTASKBARPOS, AppData) = 0 then
   raise Exception.Create('SHAppBarMessage zwrócił fałsz podczas gdy'+
   'próbował znaleźć pozycje Paska Zadań');
  // W innej sytuacji wszystko gra, pokazanie rezultatu
  Result := AppData.uEdge;
  ARect := AppData.rc;
end;

// procedura znajdź pasek
procedure znajdz;
var
  Rect: TRect;
  DestLeft: Integer;
  DestTop: Integer;
begin
// ustalenie wysokości i odległości dla paska
  DestLeft := form1.Left;
  DestTop := form1.Top;
  case FindTaskBar(Rect) of
    ABE_BOTTOM:
    begin
      DestLeft := Trunc((Screen.Width - form1.Width) / 2.0);
      DestTop := Rect.Top - form1.Height;
    end;
    ABE_LEFT:
    begin
      DestTop := Trunc((Screen.Height - form1.Height) / 2.0);
      DestLeft := Rect.Right;
    end;
    ABE_RIGHT:
    begin
      DestTop := Trunc((Screen.Height - form1.Height) / 2.0);
      DestLeft := Rect.Left - form1.Width;
    end;
    ABE_TOP:
    begin
      DestLeft := Trunc((Screen.Width - form1.Width) / 2.0);
      DestTop := Rect.Bottom;
    end;
  end;
// wyświetl komunikat, ze znaleziono na wysokości XX w odległości XX
  showmessage(Format('Znaleziono przy wartościach: Top: %d Left: %d Bottom: %d Right: %d)',
    [Rect.Top, Rect.Left, Rect.Bottom, Rect.Right]);
  // przenieś aplikacje nad paskiem zadań
  while (form1.Left <> DestLeft) or (form1.Top <> DestTop) do
  begin
    if form1.Left < DestLeft then
      form1.Left := form1.Left + 1
    else if form1.Left <> DestLeft then
      form1.Left := form1.Left - 1;

    if form1.Top < DestTop then
      form1.Top := form1.Top + 1
    else if form1.Top <> DestTop then
      form1.Top := form1.Top - 1;

    Application.ProcessMessages;
  end;
end;

procedure TForm1.FormCreate(Sender: TObject);
var
scrht:integer;
begin
form1.Left := 0;
form1.Width := screen.Width;
scrht := screen.Height; //z niektorych powodów musimy ustalić najpierw tą wartość
with AppData do //początek algorytmu
begin

AppData.cbSize := 20;
Appdata.hWnd := form1.Handle;
AppData.uEdge := ABE_Bottom;
AppData.rc.Left := 0;
AppData.rc.Top := Screen.WorkAreaHeight-form1.Height+10;
AppData.rc.Right := form1.Width;
AppData.rc.Bottom := screen.height-20;
SHAppBarMessage(ABM_NEW, AppData); //Dodaj do systemowej listy
SHAppBarMessage(ABM_ACTIVATE, AppData); //Aktywuj to
SHAppBarMessage(ABM_SETPOS, AppData); //Ustaw pozycje
end;
application.ProcessMessages;
znajdz;
end;

Aby usunąć nasz program umieszczony w taskbar należy w procedurze OnClose umieścić:

SHAppBarMessage(ABM_REMOVE, AppData);

(podpowiedź umieszczona przez użytkownika mi)

FAQ

1 komentarz

wskazówka przeniesiona z działu artykuły do FAQ na prośbę Administratora 4programmers.net