Własne rozszerzenie (kolejna odsłona)

0

Heja.
Zanim zaczniecie na mnie bluzgać wiedzcie, że przeczytałem artykuł w dziale Gotowce, ale nie zadowala mnie on do końca.
Bawię się z rejestrem pod XP i tam podany przez A. Boducha tekst nie działa tak jak tego chciałbym. Ja to robię na kluczu

[code]HKEY_LOCAL_MACHINE\SOFTWARE\Classes[/code]

i dopiero działa "od kopa", czyli nie trzeba ponownie uruchamiać kompa. Natomiast do jednej rzeczy nie mogę dotrzeć. A mianowicie nie udaje mi się <ort>odświerzyć </ort>samoczynnie ikony w explorerze, tzn. aby zmiany zaszły musze rebootować, a chodzi mi, żeby dało się tego uniknąć (a wszyscy wiemy, że w XP się da).
O dziwo w aplecie Opcje Folderów, w zakładce Typy plików jest wczytywana dobra ikona.
Chodzi mi właśnie o to co robi ten aplet, tzn. po zmianie ikony windowsowy explorer "mrugnie" i już wie jaką ikonę ma rysować.

0

W wielu programach do tweakowania systemu jest cos takiego jak clear icon cache, to cie powinnno naprowadzic na trop :>

0

Dzienx, Wolverine, rzeczywiście poszukałem coś na temat IconCache i znalazłem dwie metody:

  1. Można usunąć ten plik (chociaż ja nie wiem jak go znaleźć :))

  2. Można użyć kodu:

Author: Thomas Stutz

[code]

{
Microsoft's Tweak UI has a feature 'rebuild icon cache now'.
Windows then rebuilds its internal cache of icons.
Unfortunately, there is no single API to do this.
}

uses
Registry;

function RefreshScreenIcons : Boolean;
const
KEY_TYPE = HKEY_CURRENT_USER;
KEY_NAME = 'Control Panel\Desktop\WindowMetrics';
KEY_VALUE = 'Shell Icon Size';
var
Reg: TRegistry;
strDataRet, strDataRet2: string;

procedure BroadcastChanges;
var
success: DWORD;
begin
SendMessageTimeout(HWND_BROADCAST,
WM_SETTINGCHANGE,
SPI_SETNONCLIENTMETRICS,
0,
SMTO_ABORTIFHUNG,
10000,
success);
end;

begin
Result := False;
Reg := TRegistry.Create;
try
Reg.RootKey := KEY_TYPE;
// 1. open HKEY_CURRENT_USER\Control Panel\Desktop\WindowMetrics
if Reg.OpenKey(KEY_NAME, False) then
begin
// 2. Get the value for that key
strDataRet := Reg.ReadString(KEY_VALUE);
Reg.CloseKey;
if strDataRet <> '' then
begin
// 3. Convert sDataRet to a number and subtract 1,
// convert back to a string, and write it to the registry
strDataRet2 := IntToStr(StrToInt(strDataRet) - 1);
if Reg.OpenKey(KEY_NAME, False) then
begin
Reg.WriteString(KEY_VALUE, strDataRet2);
Reg.CloseKey;
// 4. because the registry was changed, broadcast
// the fact passing SPI_SETNONCLIENTMETRICS,
// with a timeout of 10000 milliseconds (10 seconds)
BroadcastChanges;
// 5. the desktop will have refreshed with the
// new (shrunken) icon size. Now restore things
// back to the correct settings by again writing
// to the registry and posing another message.
if Reg.OpenKey(KEY_NAME, False) then
begin
Reg.WriteString(KEY_VALUE, strDataRet);
Reg.CloseKey;
// 6. broadcast the change again
BroadcastChanges;
Result := True;
end;
end;
end;
end;
finally
Reg.Free;
end;
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
RefreshScreenIcons
end;

{
The result is Window's erasing all its icons, and recalculating them
based on the registry settings.
This means if you have changed a DefaultIcon key within the registry for
some application or file, Windows will display the new icon when the
refresh is completed.

Original source:
www.mvps.org/vbnet/index.html?code/reg/screenrefresh.htm
Translated from VB by Thomas Stutz
}[/code]

0

heja.
Niestety powyższa procedura też nie działa tak jak powinna, a nawet robi za wiele, tzn. przestawia ikony na pulpicie (a chyba nikt tego nie chce).
Wiem, że istnieje proste rozwiązanie tego problemu.
Niech mi ktoś pomoże!!! ;-(

0

Wystarczy odświeżyć ikonki w explorerze:

<font size="18">SHChangeNotify(SHCNE_ASSOCCHANGED, SHCNF_IDLIST, nil, nil);</span>

Do uses chyba shellapi, ale nie jestem pewny.

// Do postu poniżej:
Looooooooooooooooooooool...

0

No właśnie też jestem na podobnym tropie, tzn. należy broadcastować do wszystkich okien jakiś message, ale nie wiem jakie w nim mają być parametry, żeby eksplorer zrozumiał, że chodzi o <ort>odświeżenie</ort>.
Możeby spróbować przechwycić message z apletu Opcje folderów, hmmm?

0

Tak!!!!!!
To działa!!!!!!
SHChangeNotify rulez :)

1 użytkowników online, w tym zalogowanych: 0, gości: 1