AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Win32/Win64 API (native code) Delphi Größe und Position der Taskbar ermitteln?
Thema durchsuchen
Ansicht
Themen-Optionen

Größe und Position der Taskbar ermitteln?

Ein Thema von Mithrandir · begonnen am 9. Okt 2009 · letzter Beitrag vom 15. Okt 2009
Antwort Antwort
Benutzerbild von Mithrandir
Mithrandir
(CodeLib-Manager)

Registriert seit: 27. Nov 2008
Ort: Delmenhorst
2.379 Beiträge
 
#1

Größe und Position der Taskbar ermitteln?

  Alt 9. Okt 2009, 15:55
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.

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...
米斯蘭迪爾
"In einer Zeit universellen Betruges wird das Aussprechen der Wahrheit zu einem revolutionären Akt." -- 1984, George Orwell
  Mit Zitat antworten Zitat
Benutzerbild von Mithrandir
Mithrandir
(CodeLib-Manager)

Registriert seit: 27. Nov 2008
Ort: Delmenhorst
2.379 Beiträge
 
#2

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

  Alt 9. Okt 2009, 16:43
Gnarf...

"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;
米斯蘭迪爾
"In einer Zeit universellen Betruges wird das Aussprechen der Wahrheit zu einem revolutionären Akt." -- 1984, George Orwell
  Mit Zitat antworten Zitat
Benutzerbild von mh166
mh166

Registriert seit: 14. Nov 2004
Ort: Chemnitz
443 Beiträge
 
Delphi 10.2 Tokyo Starter
 
#3

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

  Alt 14. Okt 2009, 20:41
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
Tiefgründige Sätze unserer Zeit:
Zitat von Luckie:
Und diesen Token zur Laufzeit zu modifizieren würde bedeuten, dass du zur laufzeit das Token ändern musst.
  Mit Zitat antworten Zitat
Benutzerbild von Mithrandir
Mithrandir
(CodeLib-Manager)

Registriert seit: 27. Nov 2008
Ort: Delmenhorst
2.379 Beiträge
 
#4

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

  Alt 14. Okt 2009, 20:58


So einfach? Danke...

//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.
米斯蘭迪爾
"In einer Zeit universellen Betruges wird das Aussprechen der Wahrheit zu einem revolutionären Akt." -- 1984, George Orwell
  Mit Zitat antworten Zitat
Benutzerbild von mh166
mh166

Registriert seit: 14. Nov 2004
Ort: Chemnitz
443 Beiträge
 
Delphi 10.2 Tokyo Starter
 
#5

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

  Alt 15. Okt 2009, 16:04
Freut mich, dass ich helfen konnte. 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
Tiefgründige Sätze unserer Zeit:
Zitat von Luckie:
Und diesen Token zur Laufzeit zu modifizieren würde bedeuten, dass du zur laufzeit das Token ändern musst.
  Mit Zitat antworten Zitat
Benutzerbild von RWarnecke
RWarnecke

Registriert seit: 31. Dez 2004
Ort: Stuttgart
4.408 Beiträge
 
Delphi XE8 Enterprise
 
#6

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

  Alt 15. Okt 2009, 17:16
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.
Rolf Warnecke
App4Mission
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 20:30 Uhr.
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz