Ikonka skrótu bez strzałki...

0

czesc
szukalem i nie znalazlem.
jak pobrac ikone skrotu ale bez tej cholernej strzaleczki w lewym dolnym rogu ikony?

pozdr

0

Chyba trzeba pobrać ścieżkę do pliku do którego odwołuje się skrót i z tego pliku pobrać ikonę ?
Z tego pliku system pobiera ikonę i dokleja do niej strzałkę.

0
mądry inaczej napisał(a)

Chyba trzeba pobrać ścieżkę do pliku do którego odwołuje się skrót i z tego pliku pobrać ikonę ?
Z tego pliku system pobiera ikonę i dokleja do niej strzałkę.

i tak i nie... bo ikone skrotu mozna zmienic...
myslalem ze jest jakis systemowy "gotowiec" do tego, no ale coz, jak nie ma to trzeba sie bedzie samemu nad tym pomeczyc... :/

////napisalem cos takiego (na szybko wiec nie czepiac sie kodu ;] ):

function extractIconFromLnk(Plik:WideString):HIcon;
var
  MyObj : IUnknown;
  MyLnk : IShellLink;
  MyPf  : IPersistFile;
  ok    : TWin32FindData;
  IconFile  : array [0..MAX_PATH] of char;
  LinkedFile  : array [0..MAX_PATH] of char;
  index:integer;
  index2:word;
  h:HIcon;
  hLarge:HIcon;
  info:_SHFILEINFO;
begin
  MyObj := CreateComObject(CLSID_ShellLink);
  MyLnk := MyObj as IShellLink;
  MyPf  := MyObj as IPersistFile;
  MyPf.Load(PWideChar(Plik),fmOpenRead);

  MyLnk.GetIconLocation(iconFile, MAX_PATH, index); //wyciagamy sciezke do pliku zawierajacego ikone skrotu oraz jej index
  MyLnk.GetPath(linkedFile, MAX_PATH, ok,0);//wyciagamy nazwe pliku na ktory wskazuje skrot
  index2:=index;
h:=0;
if fileexists(iconFile) then
        begin //wyciagamy ta ikone, na ktora wskazuje skrot
        h:=ExtractAssociatedIcon(hInstance,PChar(String(iconfile)), index2) ;
        end;

if h<=0 then
        begin //wyziagamy ikone z pliku na ktory wskazuje skrot
        SHGetFileInfo(PChar(String(linkedFile)), 0, info, SizeOf(TSHFILEINFO),  SHGFI_ICON or SHGFI_SMALLICON );
        h:=info.hIcon;
        end;

if h<=0 then
        begin //wyziagamy ikone skrotu
        SHGetFileInfo(PChar(plik), 0, info, SizeOf(TSHFILEINFO),  SHGFI_ICON or SHGFI_SMALLICON );
        h:=info.hIcon;
        end;
  result:=h;
end;

po 1. niektore ikonki wygladaja naprawde kiepsko (cos jak by przeskalowane).
po 2. jak ta funkcja wezme ikonkie pliku ".bat" to mi zwraca ikone folderu :/

0

Miałem kiedyś podobne problemy z wyświetlaniem ikon na liście plików (chodziło o zawartość FTP)
Nie wszystkie systemowe ikony dało się prawidłowo wyświetlić lub pobrać, często miałem ikonę folderu zamiast właściwej ikony. Szczególnie pojawiał się błąd jeśli np miałem pokazać ikonę pliku *.doc ale nie systemową tylko taką jaką wyświetla Windows po przypisaniu np do Office - powinna być ikona z literką W, a była systemowa.
Więc zrobiłem to po chłopsku - dla każdego pliku którego ikonę miałem pobrać, tworzyłem w katalogu Temp, pusty plik o takim samym rozszerzeniu, pobierałem z niego obraz ikony i kasowałem :)
A dla plików exe normalnie.

0

Jeszcze mozna dostac sie do ikonki poprzez interfejs IExtractIcon (bo nie sluzy on tylko aby tworzyc ale tez i pobierac) z interfejsu IShellFolder (a ten startuje z Desktop ...).

0

dobra, w sumie rozwiazane, choc mam gdzies dziwny blad...:
sprawca zle wyswietlanych niektorych ikonek byl ExtractAssociatedIcon(). Zamienilem na ExtractIconEx i jest ok.

dziwi mnie tylko dlaczego tak sie dzieje:
otoz czasem ta funkcja zwracala mi hicon=0. a tak byc nie powinno, poniewaz skoro plik istnieje, to musi posiadac ikone. a co za tym idzie ten kod:

if h<=0 then
        begin //wyziagamy ikone skrotu
        SHGetFileInfo(PChar(plik), 0, info, SizeOf(TSHFILEINFO),  SHGFI_ICON or SHGFI_SMALLICON );
        h:=info.hIcon;
        end;

musi nam te ikone zwrocic. nie wiem wiec dlaczego zwraca czasem 0...
ale jezcze bardziej dziwi mnie fakt, ze gdy wycialem ten fragment z funkcji, a dalem go po jej wywolaniu to wszystko dziala idealnie :|

teraz wyglada to mniej wiecej tak:

function extractIconFromLnk(Plik:WideString):HIcon;
var
  MyObj : IUnknown;
  MyLnk : IShellLink;
  MyPf  : IPersistFile;
  ok    : TWin32FindData;
  IconFile  : array [0..MAX_PATH] of char;
  LinkedFile  : array [0..MAX_PATH] of char;
  index:integer;
  index2:word;
  h:HIcon;
  hLarge:HIcon;
  info:_SHFILEINFO;

begin
  MyObj := CreateComObject(CLSID_ShellLink);
  MyLnk := MyObj as IShellLink;
  MyPf  := MyObj as IPersistFile;
  MyPf.Load(PWideChar(Plik),fmOpenRead);
  MyLnk.GetIconLocation(iconFile, MAX_PATH, index);
  MyLnk.GetPath(linkedFile, MAX_PATH, ok,0);
  index2:=index;
h:=0;
if (lowercase(extractfileext(plik))='.lnk') then
        begin
        //wyciagamy ikonke, ktora wskazuje nam skrot...
        ExtractIconEx(PChar(String(iconfile)), index2, hLarge, h, 1);

        if (h<=0) then
                begin //wyziagamy ikone z pliku na ktory wskazuje skrot
                SHGetFileInfo(PChar(String(linkedFile)), 0, info, SizeOf(TSHFILEINFO),  SHGFI_ICON or SHGFI_SMALLICON );
                h:=info.hIcon;
                end;
        end;
{ TO WYCIETE BO CZASEM NIE DZIALALO....:
if h<=0 then
        begin //wyziagamy ikone skrotu
        SHGetFileInfo(PChar(plik), 0, info, SizeOf(TSHFILEINFO),  SHGFI_ICON or SHGFI_SMALLICON );
        h:=info.hIcon;
        end;   }
  result:=h;
end;

i w funkcji zwracajacej ikone jako TIcon (potrzebne, bo tu np sprawdzam czy "filename" jest folderem i jesli tak, to zwracam "swoja" ikonke folderu)

[...]
icon:=TIcon.Create;
icon.Handle:=extractIconFromLnk(filename);

if icon.Handle<=0 then //tam nie dzialalo a tu dziala... wtf!?
        begin
        SHGetFileInfo(PChar(filename), 0, info, SizeOf(TSHFILEINFO),  SHGFI_ICON or SHGFI_SMALLICON );
        icon.Handle:=info.hIcon;
        end;

result:=icon;
end;

ma ktos pomysl czemu ten fragment kodu nie dzialal w mojej funkcji "extractIconFromLnk()" a dziala tutaj? :|

0

typy ...

Pchar(String(
0
reichel napisał(a)

typy ...

Pchar(String(

aaaa.... myslalem ze z WideString tez zadziala [glowa]
dzieki (po raz kolejny ;] ) [browar]

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