|
[Wersja zmieniona]
Często tworząc aplikacje obsługującą dany format pliku rejestrujemy dane rozszerzenie, aby nasz program otwieral ten zbiór i dodatkowo dla danego rozszerzenia przypisujemy odpowiednią ikone. Operacja jest banalna i sprowadza się do manipulacji wpisami w rejestrze. Nie będę tego procesu opisywał dokładnie, gdyż nie oto tutaj chodzi. I teraz po zarejestrowaniu takiego rozszerzenia i przypisaniu mu ikony chcielibyśmy aby efekt był widoczny bezpośrednio, tzn. aby plik z naszym rozszerzeniem odświeżył ikone i żeby zmieniła się ona na odpowiednią dla tego pliku.
Aby to wykonać, należy wprowadzić chwilową zmianę w rejestrze systemowym aby po odświeżeniu wszystkich okien ponownie ją przywrócić i w końcu jeszcze raz odświeżyć wszystkie okna. Zmiana dotyczyć będzie wielkości dla rozmiaru ikon. A oto kod, który to wykona:
#include <windows.h> #include <shlobj.h>
int main() {
SHChangeNotify(SHCNE_ASSOCCHANGED, SHCNF_IDLIST, NULL, NULL);
}
Wersja wcześniejsza, która czasami sprawiała problemy zwłaszcza pod WinXP (źródło napisane pod delphi):
var key:HKEY; typ,sz:dword; i,code:integer; buf:array[0..255]of char; begin if RegOpenkeyEx(HKEY_CURRENT_USER,'Control PanelDesktopWindowMetrics',0,KEY_WRITE or KEY_READ,Key)=ERROR_SUCCESS then begin typ:=REG_SZ; sz:=sizeof(buf); if RegQueryValueEx(key,'Shell Icon Size',nil,@typ,@buf,@sz)<>ERROR_SUCCESS then begin RegCloseKey(Key); exit; end;
val(buf,i,code); if code<>0 then begin RegCloseKey(Key); exit; end; inc(i); fillchar(buf,sizeof(buf),0); str(i,buf); sz:=length(buf); if RegSetValueEx(key,'Shell Icon Size',0,typ,@buf,sz)<>ERROR_SUCCESS then begin RegCloseKey(Key); exit; end;
SendMessage(HWND_BROADCAST, WM_SETTINGCHANGE, SPI_SETNONCLIENTMETRICS, 0);
dec(i); fillchar(buf,sizeof(buf),0); str(i,buf); sz:=length(buf); RegSetValueEx(key,'Shell Icon Size',0,typ,@buf,sz);
RegCloseKey(Key);
SendMessage(HWND_BROADCAST, WM_SETTINGCHANGE, SPI_SETNONCLIENTMETRICS, 0); end; end;
opis dzialania powyzszej funkcji:
1. Otwarcie klucza rejestru:
HKEY_CURRENT_USER/Control Panel/Desktop/WindowMetrics
2. Odczytanie wartosci: Shell Icon Size
3. Odczytana wartosc jest liczba calkowita. Inkrementujemy ja o 1 i nadpisujemy wartosc Shell Icon Size w danym kluczu
4. Odswiezamy wszystkie okna za pomoca sendmessage z kolejnymi parametrami: HWND_BROADCAST,WM_SETTINGCHANGE,SPI_SETNONCLIENTMETRICS,0
5. ponownie aktualizujemy wartosc Shell Icon Size rejestru wartoscia oryginalna
6. Ponowne odswezenie okien (pkt. 4)
7. Zamykamy klucz rejestru. |