程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> 更多編程語言 >> Delphi >> Delphi 編寫定制顯示疊加圖標的Shell擴展

Delphi 編寫定制顯示疊加圖標的Shell擴展

編輯:Delphi

 本文示例源代碼或素材下載

  大家都知道快捷方式會在原有的圖標左下方重疊個小箭頭的圖標,

  文件夾共享也會在原有的圖標下面出現個手的圖標。

Delphi 編寫定制顯示疊加圖標的Shell擴展

  通過疊加圖標的顯示我們能很直觀的了解到該圖標所代表的含義,

  下面我們就編寫一個圖標疊加擴展處理器,如果文件屬性為只讀的,就在圖標的右下方加個小鎖。

  我們准備了一個16*16的小鎖圖標readonly.ico並存放到C:目錄下:

Delphi 編寫定制顯示疊加圖標的Shell擴展 

  擴展接口

  圖標疊加擴展處理器主要實現接口 IShellIconOverlayIdentifIEr

  TIconOverlay

 1Delphi 編寫定制顯示疊加圖標的Shell擴展type
 2Delphi 編寫定制顯示疊加圖標的Shell擴展  TIconOverlay = class(TComObject, IShellIconOverlayIdentifIEr)
 3Delphi 編寫定制顯示疊加圖標的Shell擴展  public
 4Delphi 編寫定制顯示疊加圖標的Shell擴展    { IShellIconOverlayIdentifIEr }
 5Delphi 編寫定制顯示疊加圖標的Shell擴展    //判斷疊加圖標是否應該添加到該Shell對象之上
 6Delphi 編寫定制顯示疊加圖標的Shell擴展    function IsMemberOf(pwszPath: PWideChar; dwAttrib: DWord): HResult; stdcall;
 7Delphi 編寫定制顯示疊加圖標的Shell擴展    //提供疊加圖標的路徑
 8Delphi 編寫定制顯示疊加圖標的Shell擴展    function GetOverlayInfo(pwszIconFile: PWideChar; cchMax: Integer;
 9Delphi 編寫定制顯示疊加圖標的Shell擴展      var pIndex: Integer; var pdwFlags: DWord): HResult; stdcall;
10Delphi 編寫定制顯示疊加圖標的Shell擴展    //設置疊加圖標的優先級
11Delphi 編寫定制顯示疊加圖標的Shell擴展    function GetPriority(out pIPriority: Integer): HResult; stdcall;
12Delphi 編寫定制顯示疊加圖標的Shell擴展  end;

 IShellIconOverlayIdentifIEr 的 IsMemberOf首先被調用

  參數:

  pwszPath: Shell對象的完整路徑

  dwAttrib: Shell對象的屬性

  IsMemberOf

1Delphi 編寫定制顯示疊加圖標的Shell擴展function TIconOverlay.IsMemberOf(pwszPath: PWideChar; dwAttrib: DWord): HResult;
2Delphi 編寫定制顯示疊加圖標的Shell擴展begin
3Delphi 編寫定制顯示疊加圖標的Shell擴展  if (dwAttrib and faReadonly) = faReadonly then
4Delphi 編寫定制顯示疊加圖標的Shell擴展    Result := S_OK
5Delphi 編寫定制顯示疊加圖標的Shell擴展  else
6Delphi 編寫定制顯示疊加圖標的Shell擴展    Result := S_FALSE;
7Delphi 編寫定制顯示疊加圖標的Shell擴展end;

GetPriority設置顯示優先級,多個疊加圖標時有效

  參數:

  pIPriority: 可以設置為0-100之間的值,0的優先級別最高

  GetPriority

1Delphi 編寫定制顯示疊加圖標的Shell擴展function TIconOverlay.GetPriority(out pIPriority: Integer): HResult;
2Delphi 編寫定制顯示疊加圖標的Shell擴展begin
3Delphi 編寫定制顯示疊加圖標的Shell擴展  pIPriority := 0;
4Delphi 編寫定制顯示疊加圖標的Shell擴展  Result := S_OK;
5Delphi 編寫定制顯示疊加圖標的Shell擴展end;

  GetOverlayInfo在Shell啟動時加載圖標到系統圖標裡

  參數:

  pwszIconFile: Icon圖標的完整路徑,可以是.exe,.dll和.ico文件類型

  cchMax: pwszIconFile 的 buffer大小

  pIndex: 如果文件包含多個圖標的話指定使用圖標的索引值

  pdwFlags: 指定返回什麼類型的信息

 ISIOI_ICONFILE: 返回pwszIconFile的路徑信息

   ISIOI_ICONINDEX: 返回pIndex的索引值

  可以使用其中一種標識或者兩者一起使用

  GetOverlayInfo

 1Delphi 編寫定制顯示疊加圖標的Shell擴展function TIconOverlay.GetOverlayInfo(pwszIconFile: PWideChar; cchMax: Integer;
 2Delphi 編寫定制顯示疊加圖標的Shell擴展  var pIndex: Integer; var pdwFlags: DWord): HResult;
 3Delphi 編寫定制顯示疊加圖標的Shell擴展var
 4Delphi 編寫定制顯示疊加圖標的Shell擴展  OverlayPath: WideString;
 5Delphi 編寫定制顯示疊加圖標的Shell擴展begin
 6Delphi 編寫定制顯示疊加圖標的Shell擴展  OverlayPath := 'C:readonly.ico';
 7Delphi 編寫定制顯示疊加圖標的Shell擴展  lstrcpynW(pwszIconFile, PWideChar(OverlayPath), cchMax);
 8Delphi 編寫定制顯示疊加圖標的Shell擴展  pdwFlags := ISIOI_ICONFILE;
 9Delphi 編寫定制顯示疊加圖標的Shell擴展  Result := S_OK;
10Delphi 編寫定制顯示疊加圖標的Shell擴展end;

 實現擴展接口後接下來就是注冊擴展

  UpdateRegistry

 1Delphi 編寫定制顯示疊加圖標的Shell擴展procedure TIconOverlayFactory.UpdateRegistry(Register: Boolean);
 2Delphi 編寫定制顯示疊加圖標的Shell擴展var
 3Delphi 編寫定制顯示疊加圖標的Shell擴展  ClassID: string;
 4Delphi 編寫定制顯示疊加圖標的Shell擴展begin
 5Delphi 編寫定制顯示疊加圖標的Shell擴展  if Register then
 6Delphi 編寫定制顯示疊加圖標的Shell擴展  begin
 7Delphi 編寫定制顯示疊加圖標的Shell擴展    inherited UpdateRegistry(Register);
 8Delphi 編寫定制顯示疊加圖標的Shell擴展
 9Delphi 編寫定制顯示疊加圖標的Shell擴展    ClassID := GUIDToString(Class_IconOverlay);
10Delphi 編寫定制顯示疊加圖標的Shell擴展    CreateRegKey('SoftwareMicrosoftWindowsCurrentVersionExplorerShellIconOverlayIdentifIErsShellExt', '', ClassID, HKEY_LOCAL_MacHINE);
11Delphi 編寫定制顯示疊加圖標的Shell擴展    if (Win32Platform = VER_PLATFORM_WIN32_NT) then
12Delphi 編寫定制顯示疊加圖標的Shell擴展      with TRegistry.Create do
13Delphi 編寫定制顯示疊加圖標的Shell擴展        try
14Delphi 編寫定制顯示疊加圖標的Shell擴展          RootKey := HKEY_LOCAL_MacHINE;
15Delphi 編寫定制顯示疊加圖標的Shell擴展          OpenKey('SOFTWAREMicrosoftWindowsCurrentVersionShell Extensions', True);
16Delphi 編寫定制顯示疊加圖標的Shell擴展          OpenKey('Approved', True);
17Delphi 編寫定制顯示疊加圖標的Shell擴展          WriteString(ClassID, 'Icon Overlay Shell Extension');
18Delphi 編寫定制顯示疊加圖標的Shell擴展        finally
19Delphi 編寫定制顯示疊加圖標的Shell擴展          Free;
20Delphi 編寫定制顯示疊加圖標的Shell擴展        end;
21Delphi 編寫定制顯示疊加圖標的Shell擴展  end
22Delphi 編寫定制顯示疊加圖標的Shell擴展  else begin
23Delphi 編寫定制顯示疊加圖標的Shell擴展    DeleteRegKey('SoftwareMicrosoftWindowsCurrentVersionExplorerShellIconOverlayIdentifIErsShellExt', HKEY_LOCAL_MacHINE);
24Delphi 編寫定制顯示疊加圖標的Shell擴展    inherited UpdateRegistry(Register);
25Delphi 編寫定制顯示疊加圖標的Shell擴展    end;
26Delphi 編寫定制顯示疊加圖標的Shell擴展end;

  使用Regsvr32注冊完我們的dll後並不能馬上看到效果,因為圖標是在Shell啟動時才加載的。

  重啟Explorer或者新開個Explorer進程就可以看到效果了。

Delphi 編寫定制顯示疊加圖標的Shell擴展

  由於只是個簡單的應用,在IsMemberOf裡只用了dwAttrib就可以判斷只讀屬性了,並沒有用到pwszPath參數。

  根據這個參數我們可以定制很多種其他的應用。






  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved