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
:
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):
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.
Widze, ze styl classic wciaz niesmiertelny – tez mam do niego slabosc ;)
A wpis ciekawy – przyda sie.
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]
Ja nawet gdybym kiedyś miał przejść na Windows 7 to tylko i wyłącznie na Classic :D
Pasek zadan z Win7 w temacie Classic wyglada troche lipnie, dlatego tez uzywam standardowego Aero. Ale pod XP u mnie tez rzadzi classic.
Dobry wpis! Nie wiedziałem że istnieje coś takiego. WinAPI kryje tak wiele tajemnic…
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)
siema jak sie dodaje cos do paska zadan???
Wszystko ładnie, tylko brakuje informacji jak to wrzucić do kodu managed. Shell.dll chyba się z C# nie lubi ;-)
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ć :)
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?