Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Win32/Win64 API (native code) (https://www.delphipraxis.net/17-win32-win64-api-native-code/)
-   -   Delphi Größe und Position der Taskbar ermitteln? (https://www.delphipraxis.net/141467-groesse-und-position-der-taskbar-ermitteln.html)

Mithrandir 9. Okt 2009 14:55


Größe und Position der Taskbar ermitteln?
 
Hi ihr,

für ein aktuelles Projekt muss ich wissen, wo sich die Taskbar befindet, und welche Dimensionen diese hat. Nun habe ich mir jetzt damit beholfen, mit Delphi-Referenz durchsuchenFindWindow und dem Klassennamen "Shell_TrayWnd" ein Handle auf die Leiste zu kriegen, um dann mit Delphi-Referenz durchsuchenGetWindowRect dessen Dimensionen zu ermitteln.

Auch wenn sich der Klassenname der Taskleiste schon seit Urzeiten nicht geändert hat, empfinde ich diese Lösung als... schmutzig. Ein Blick in die MSDN verrät mir, dass es immer noch keine Funktion gibt, um Informationen über die Taskleiste zu bekommen. Stimmt das?

Hintergrund:
Ich möchte gerne so ein Fenster erstellen: Notification Area Flyout
Microsoft betitelt sie als "Notification Area Flyouts", schweigt sich aber darüber aus, wie man a) den Stil dieser Fenster hinbekommt und b) wie man sie positioniert. Wahrscheinlich arbeiten sie selbst mit FindWindow und wollen es nicht zugeben. :wall:

P.S.: Delphi-Referenz durchsuchenSPI_GETWORKAREA hilft mir auch nicht wirklich weiter, da man sich ja auch durchaus Delphi-Referenz durchsuchenAppBars an die Ränder klatschen kann... :? Und dann wird es schwer, die Taskleiste zu finden...

Mithrandir 9. Okt 2009 15:43

Re: Größe und Position der Taskbar ermitteln?
 
Gnarf... :wall:

"SHAppBarMessage(ABM_GETTASKBARPOS, abd)" liefert die Position der Taskbar, ohne dass man mit FindWindow herumspielen muss. Ein wenig Mathe erledigt dann den Rest...

Delphi-Quellcode:
procedure SetWindowPosition(wnd: HWND);
var
  TaskBarRct: TRect;
  X: Integer;
  Y: Integer;
  abd: TAppBarData;
begin
  if wnd <> INVALID_HANDLE_VALUE then
  begin
     abd.cbSize := SizeOf(TAppBarData);
     abd.hWnd := wnd;
     SHAppBarMessage(ABM_GETTASKBARPOS, abd);
     TaskBarRct := abd.rc;

    //TaskBar left & top
    if (TaskBarRct.TopLeft.X = 0) and (TaskbarRct.TopLeft.Y = 0) then
    begin
      //left
      if TaskBarRct.BottomRight.Y > TaskBarRct.BottomRight.X then
      begin
        X := TaskBarRct.BottomRight.X + 5;
        Y := TaskBarRct.BottomRight.Y - 5 - WindowHeight;
        MoveWindow(Wnd, X, Y, WindowWidth, WindowHeight, true);
      end
      else
      //top
      begin
        X := TaskBarRct.BottomRight.X - 5 - WindowWidth;
        Y := TaskBarRct.BottomRight.Y + 5;
        MoveWindow(Wnd, X, Y, WindowWidth, WindowHeight, true);
      end;
    end;

    //TaskBar bottom
    if (TaskBarRct.TopLeft.X = 0) and (TaskbarRct.TopLeft.Y <> 0) then
    begin
      X := TaskBarRct.BottomRight.X - 5 - WindowWidth;
      Y := TaskbarRct.TopLeft.Y - 5 - WindowHeight;
      MoveWindow(Wnd, X, Y, WindowWidth, WindowHeight, true);
    end;

    //Taskbar right
    if (TaskBarRct.TopLeft.X <> 0) and (TaskbarRct.TopLeft.Y = 0) then
    begin
      X := TaskBarRct.TopLeft.X - 5 - WindowWidth;
      Y := TaskBarRct.BottomRight.Y - 5 - WindowHeight;
      MoveWindow(Wnd, X, Y, WindowWidth, WindowHeight, true);
    end;
  end;
end;

mh166 14. Okt 2009 19:41

Re: Größe und Position der Taskbar ermitteln?
 
Warum willst du unbedingt rechnen? TAppBarData gibt es dir doch korrekt vor?

Delphi-Quellcode:
FillChar(abd, SizeOf(TAppBarData), 0);
abd.cbSize := SizeOf(TAppBarData);
SHAppBarMessage(ABM_GETTASKBARPOS, abd);
case abd.uEdge of
  ABE_LEFT, ABE_RIGHT:
    // Do whatever you want ;)
  ABE_TOP, ABE_BOTTOM:
    // Another chance to do something
end;
So verwende ich das in meinem aktuellen Projekt - tut wunderbarstens, ganz ohne jegliche Mathematik. ;)

mfg, mh166

Mithrandir 14. Okt 2009 19:58

Re: Größe und Position der Taskbar ermitteln?
 
:shock:

So einfach? Danke... :wall:

//Edit: Im Nachhinein würde sich das auch ganz gut in der CL machen. Im Zuge der aktuellen Abarbeitung werde ich die Funktion mal entsprechend aufbereiten und zur Diskussion stellen.

mh166 15. Okt 2009 15:04

Re: Größe und Position der Taskbar ermitteln?
 
Freut mich, dass ich helfen konnte. :D Hatte auch lange gebraucht ... Kollege hats mir dann zum Glück gezeigt. ;)

Aber n Beitrag dazu in die CL wär klasse. Bereite mal schön. =)

mfg, mh166

RWarnecke 15. Okt 2009 16:16

Re: Größe und Position der Taskbar ermitteln?
 
Zitat:

Zitat von Daniel G
//Edit: Im Nachhinein würde sich das auch ganz gut in der CL machen. Im Zuge der aktuellen Abarbeitung werde ich die Funktion mal entsprechend aufbereiten und zur Diskussion stellen.

Hallo Daniel, ich würde mich auch freuen, wenn Du den Sourcecode bei mir in Code-Orakel Online einstellen würdest.


Alle Zeitangaben in WEZ +1. Es ist jetzt 21:04 Uhr.

Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz