2011-09-26 13:26:08
Schowek - ej, oni go w Viście naprawili!

I ja to mówię poważnie. Nie mówi się o tym głośno, ba, nawet na oficjalnej liście nowości w Win32 API dla Visty nie ma o tym napisane, więc nie wszyscy o tym wiedzą. A chodzi oczywiście o zakleszczanie się jednego lub więcej programów w sytuacji, gdy jeden z programów monitorujących schowek (np. fikuśny edytor tekstowy) najzwyczajniej zawiesi się. Plaga a'la czasy Win98, gdy jeden program mógł wyłożyć cały system do góry nogami, ma się całkiem nieźle nawet pod Windows 7, ale od Visty w górę wreszcie zdecydowali się coś z tym zrobić. Tylko dlaczego ludzie dowiadują się o tym przypadkiem - zakładając że w ogóle?

Nie wnikam czemu nie informuje się o tym wprost, ale podejrzewam że jest jeszcze trochę takich perełek - tylko nie dogrzebałem się do nich. Jeśli coś znajdę, to napiszę. Ale do rzeczy.

Monitorowanie schowka pozwala zaimplementować - między innymi - prostą, ale ułatwiającą życie użytkownika funkcjonalność - blokowanie funkcji wklejania w sytuacji, gdy schowek zostaje zapełniony danymi, których program nie może wkleić lub gdy schowek zostaje opróżniony i odblokowywania, gdy znajduje się w nim jakaś "wklejalna" informacja. Jedną, aczkolwiek mało wydajną metodą jest polling, czyli ustawiamy jakiś timer i okresowo sprawdzamy co jest w schowku. Za częste sprawdzanie spowoduje niepotzebne zużywanie mocy przerobowej komputera, za rzadkie - user będzie musiał czekać aż przycisk/polecenie się odblokuje albo doprowadzi do próby wklejenia czegoś, co nie jest obsługiwane (co w przypadku w miarę sensownie napisanego kodu, samo w sobie nie powinno być problemem). Dlatego stare API Win32 przewiduje coś takiego jak łańcuch przeglądarek schowka - od tego są funkcje SetClipboardViewer i ChangeClipboardChain. W dużym skrócie dla kogoś niezorientowanego - gdzieś tam w systemie jest lista (łańcuch) przeglądarek schowka (właściwie monitorów schowka), aplikacje same sobie tym zarządzają (i muszą same zapamiętywać co było następne w łańcuchu zanim się "dopchały"), a system rozsyła komunikaty WM_CHANGECBCHAIN gdy zmieni się coś w tym łańcuchu, oraz WM_DRAWCLIPBOARD gdy zawartość schowka zmieni się. Tego używało się przez jakieś dwie dekady (pod Windows 3.x także). Od Visty w górę mamy do dyspozycji dwie funkcje: AddClipboardFormatListener oraz RemoveClipboardFormatListener. Pierwsza dodaje wskazane okno do listy okien, w które są posyłane powiadomienia (komunikaty WM_CLIPBOARDUPDATE) o zmianach w schowku, druga usuwa wskazane okno z rzeczonej listy. Obsługa jest banalna - funkcja AddClipboardFormatListener jako argument przyjmuje uchwyt okna (w Delphi - właściwość Handle instancji klasy TForm), po czym - za każdym razem, gdy coś się zmieni w schowku - to okno będzie otrzymywać komunikat WM_CLIPBOARDUPDATE, W handlerze tego komunikatu możemy sprawdzić co jest w danym momencie w schowku. Przy niszczeniu okna (generalnie - gdy przestaje nam zależeć na byciu informowanym o zmianach w schowku) należy wywołać funkcję RemoveClipboardFormatListener, jako argument podając ten sam uchwyt okna. I to cała filozofia. Nie trzeba nic zapamiętywać za system, nie trzeba brać udziału w zarządzaniu jakimkolwiek łańcuchem/listą, a w razie jakby któraś aplikacja monitorująca schowek zawiesiła się, inne - korzystające z Viścianego mechanizmu - gwiżdżą sobie na nią i działają dalej w najlepsze.

Nie mam żadnego nowego Delphi pod ręką, ale jakby ktoś chciał wykorzystać nowe API, to informacje skąd importować te funkcje i jakie są ich sygnatury - są w podlinkowanej dokumentacji na stronie Microsoftowego MSDNu. Przypominam tylko, że konwencja wywołania to StdCall (inne mogą doprowadzać do nieprzewidzianych rezultatów, z wywrotkami w losowych momentach włącznie). A jeśli ktoś jest zainteresowany dynamicznym importowaniem ww. funkcji tak, by program działał pod XP i niżej - nie trzeba wołać LoadLibrary, wystarczy GetModuleHandle.


Może Cię zainteresować...

Link | Komentarzy: 14 | Programowanie, Tech, Techblog
Pokazuj komentarze.
Komentowanie wyłączone dla tego wpisu.
Powered by:
Hellcore Mailer - polski program pocztowyOpera Web BrowserFreeBSD - The Power to Serve!Slackware
RSSy:
Sidekick:
Projekty:
O autorze:
Zobacz:
Kategorie:
Archiwum:
Szukaj: