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)
wskazówka przeniesiona z działu artykuły do FAQ na prośbę Administratora 4programmers.net