Gdzie jest pasek zadań

2009-08-10 15:11

Programy działające w tle (np. komunikatory) często używają różnego rodzaju “wyskakujących” powiadomień, które w założeniu mają pojawiać się tuż obok zasobnika systemowego (system tray), gdzie wspomniane programy mają swoje ikonki. W rzeczywistości pozycja tych komunikatów jest często hardcode‘owana w okolicach prawego dolnego rogu ekranu. Jeśli więc użytkownik przypadkiem ma pasek zadań gdzie indziej, to wtedy cały misterny plan idzie w… las ;]
Dlatego lepszym rozwiązaniem jest sprawdzanie, gdzie tak naprawdę ów pasek się znajduje. Przez długi czas można było to zrobić poprzez zwyczajne pobranie jego uchwytu (HWND) i odczytanie wymiarów tak, jak każdego innego okna – np. przez GetWindowRect:

  1. HWND hTaskBar = FindWindow(TEXT("Shell_TrayWnd"), NULL);
  2. // "Shell_TrayWnd" to klasa okna specyficzna dla paska zadań
  3. RECT rc; GetWindowRect (hTaskBar, &rc);

Począwszy od Windows Vista nie jest to jednak możliwe, gdyż ze względu na bezpieczeństwo (tzw. izolacja sesji 0) nie da się już tak po prostu pobrać uchwytu do paska zadań ze zwykłej aplikacji. Istnieje na szczęście przenośny sposób na pobranie jego pozycji; w tym celu trzeba się posłużyć funkcją powłoki systemowej SHAppBarMessage (z nagłówka shellapi.h i biblioteki shellapi.lib):

  1. UINT GetTaskBarPos(LPRECT rc)
  2. {
  3.     APPBARDATA abd = { sizeof(APPBARDATA), NULL };
  4.     if (!SHAppBarMessage(ABM_GETTASKBARPOS, &abd)) return 0;
  5.     if (rc) memcpy (rc, &abd.rc, sizeof(RECT));
  6.     return abd.uEdge;
  7. }

Tak możemy otrzymać nie tylko wymiary prostokąta okalającego pasek, ale też informację o tym, przy której krawędzi się on znajduje. Jest ona zawarta w polu uEdge struktury zwracanej przez funkcję SHAppBarMessage i równa którejś ze stałych ABE_BOTTOM, ABE_TOP, itd.

Mając te dwie informacje możemy nie tylko wyświetlać nasze powiadomienia w odpowiednim miejscu, ale też zapewnić, żeby w razie ich nagromadzenia “rosły” one w odpowiednim kierunku.

Tags: ,
Author: Xion, posted under Programming »


10 comments for post “Gdzie jest pasek zadań”.
  1. maciek:
    August 10th, 2009 o 16:55

    Widze, ze styl classic wciaz niesmiertelny – tez mam do niego slabosc ;)

    A wpis ciekawy – przyda sie.

  2. macabre13:
    August 10th, 2009 o 19:09

    Z tymi notyfikacjami to większość aplikacji sobie nie radzi, walą na oślep prawy-dół :(
    [OT]
    Classic rządził do czasu win7, teraz używam tego przeźroczystego.
    [/OT]

  3. .Dexter.:
    August 10th, 2009 o 19:28

    Ja nawet gdybym kiedyś miał przejść na Windows 7 to tylko i wyłącznie na Classic :D

  4. vashpan:
    August 11th, 2009 o 15:52

    Pasek zadan z Win7 w temacie Classic wyglada troche lipnie, dlatego tez uzywam standardowego Aero. Ale pod XP u mnie tez rzadzi classic.

  5. Reg:
    August 16th, 2009 o 11:35

    Dobry wpis! Nie wiedziałem że istnieje coś takiego. WinAPI kryje tak wiele tajemnic…

  6. nilphilus:
    August 18th, 2009 o 17:05

    Ja tam zawsze używałem BCB do aplikacji, a tam mam to jeszcze prościej zrobione :-)

    Nawet mam osobny moduł do wyświetlania chmurek, ze skórkowalnością (trochę lipną, ale działa)

  7. lasek1522:
    October 1st, 2009 o 11:58

    siema jak sie dodaje cos do paska zadan???

  8. Asmodeusz:
    January 25th, 2010 o 14:42

    Wszystko ładnie, tylko brakuje informacji jak to wrzucić do kodu managed. Shell.dll chyba się z C# nie lubi ;-)

  9. Xion:
    January 26th, 2010 o 12:17

    No jak to jak? http://www.pinvoke.net -> SHAppBarMessage i masz kod importu funkcji do kodu managed. Co jak co, ale ty to powinieneś wiedzieć :)

  10. Anonymous:
    September 28th, 2010 o 9:39

    o wszystkim piszecie i o niczym,moje pytanie bylo jak przeniesc pasek zadan ktory jest zprawej strony anie na dole lub na gorze i dlaczego przeskoczyll?

Comments are disabled.
 


© 2017 Karol Kuczmarski "Xion". Layout by Urszulka. Powered by WordPress with QuickLaTeX.com.