Получить иконку из ярлыка

Советы » ICO » Получить иконку из ярлыка

{How to get icon from a shortcut file ? 

I have found that if you use a ListView component, 
to show a list of files in any folder that contains shortcuts, 
then the shortcut icons do not appear correctly - 
they do not show the true icon of the application to which they relate. 

However, there is a a very useful feature of SHGetFileInfo, 
which is SHGFI_LINKOVERLAY. This adds the shortcut "arrow", 
which is shown in the bottom left corner of any shortcut icon. 
The demo code below shows the basic use of the SHGFI_LINKOVERLAY feature. 
I have added code to this demo, to distingiush between shortcut and non-shortcut files - 
 without this code, it will overlay the shortcut "arrow" irrespective of the file type. 

To show the icon of a shortcut, the following code can be used as a demo: 

1. Add the following components to a new project, and adjust their 
properties according to the code below: }

 // Code for DFM file: 

object

Form1: TForm1 Left = 379 Top = 355 Width = 479 Height = 382 Caption = 'Get Icon from Shortcut File' Color = clBtnFace Font.Charset = DEFAULT_CHARSET Font.Color = clWindowText Font.Height = -11 Font.Name = 'MS Sans Serif' Font.Style = [] OldCreateOrder = False PixelsPerInch = 96 TextHeight = 13 object

ListView: TListView Left = 0 Top = 73 Width = 471 Height = 275 Align = alClient Columns = < item Width = 100 end

item Width = 100 end

> SmallImages = imgList TabOrder = 0 ViewStyle = vsReport end

object

Panel: TPanel Left = 0 Top = 0 Width = 471 Height = 73 Align = alTop TabOrder = 1 object

btnGetFile: TButton Left = 16 Top = 8 Width = 75 Height = 25 Caption = 'Get file' TabOrder = 0 OnClick = btnGetFileClick end

object

btnGetIcon: TButton Left = 104 Top = 8 Width = 75 Height = 25 Caption = 'Get icon' TabOrder = 1 OnClick = btnGetIconClick end

object

edFileName: TEdit Left = 16 Top = 40 Width = 441 Height = 21 TabOrder = 2 end

end

object

dlgOpen: TOpenDialog Filter = 'Shortcut files|*.lnk|All files|*.*' Options = [ofHideReadOnly, ofNoDereferenceLinks, ofEnableSizing] // - this is important ! Left = 248 Top = 8 end

object

imgList: TImageList BlendColor = clWhite BkColor = clWhite Masked = False ShareImages = True Left = 216 Top = 8 end

end

// 2. Add the code to the PAS file below: unit

cdShortCutIcon; interface

uses

Windows, Messages, SysUtils, Variants, Graphics, Controls, Forms, Dialogs, Buttons, ExtCtrls, StdCtrls, StrUtils, ShellAPI, CommCtrl, ImgList, ComCtrls, Classes; type

TForm1 = class

(TForm) dlgOpen: TOpenDialog; ListView: TListView; imgList: TImageList; Panel: TPanel; btnGetFile: TButton; btnGetIcon: TButton; edFileName: TEdit; procedure

btnGetFileClick(Sender: TObject); procedure

btnGetIconClick(Sender: TObject); private

{ Private declarations } public

{ Public declarations } end

; var

Form1: TForm1; implementation

{$R *.dfm} procedure

TForm1.btnGetFileClick(Sender: TObject); begin

{ choose file to get icon from } if

dlgOpen.Execute then

edFileName.Text := dlgOpen.FileName; end

; procedure

TForm1.btnGetIconClick(Sender: TObject); var

Icon : TIcon; ListItem : TListItem; shInfo : TSHFileInfo; sFileType : string

; begin

{ initialise ListView and Icon } ListView.SmallImages := imgList; Icon := TIcon.Create; try

ListView.Items.BeginUpdate; ListItem := listview.items.add;{ Initialise ListView.Item.Add } { get details about file type from SHGetFileInfo } SHGetFileInfo(PChar(edFileName.Text), 0, shInfo, SizeOf(shInfo), SHGFI_TYPENAME); sFileType := shInfo.szTypeName; { is this a shortcut file ? } if

shInfo.szTypeName = 'Shortcut' then

SHGetFileInfo(PChar(edFileName.Text), 0, shInfo, SizeOf(shInfo), SHGFI_LINKOVERLAY or

SHGFI_ICON or

SHGFI_SMALLICON or

SHGFI_SYSICONINDEX) else

{ ...otherwise treat it as a normal file} SHGetFileInfo(PChar(edFileName.Text), 0, shInfo, SizeOf(shInfo), SHGFI_ICON or

SHGFI_SMALLICON or

SHGFI_SYSICONINDEX); { assign icon } Icon.Handle := shInfo.hIcon; { List File name, Icon and FileType in ListView} ListItem.Caption := ExtractFileName(edFileName.Text); //...add filename ListItem.SubItems.Add(sFileType); //...and filetype.. ListItem.ImageIndex := imgList.AddIcon(Icon); //...and icon. finally

ListView.Items.EndUpdate; //..free memory on icon and clean up. sFileType := ''; Icon.Free; end

; end

; end

.

Другое по теме:

Категории

Статьи

Советы

Copyright © 2022 - All Rights Reserved - www.delphirus.com