1

我在 Windows 桌面窗口中有一个文件。我想自定义绘制它而不是普通的图标和文本。我几乎通过以下步骤来实现它,1.制作一个实现IExtractIcon接口的dll,然后为该文件注册一个图标处理程序shell扩展名,以使该dll由explorer.exe加载。2.在dll的dllmain函数中,子类化桌面窗口,进行自定义绘图。

这几乎可行,但仍然存在一些问题: 1. 在 winxp 中,dll 仅加载一次。重新启动PC后,不会加载dll,除非我制作了另一个具有相同扩展名的文件。我猜原因是桌面已经缓存了图标,所以它不需要加载 dll 来提取图标。但是为什么win7有效。我该怎么做才能使系统始终加载 dll?

  1. 该文件在文件系统中总是有一个扩展名,但是当它显示在桌面上时,可能不会显示该扩展名。如何根据桌面列表视图项获取文件的全名?

或者有没有其他方法可以让 explorer.exe 自动加载我的 dll?

这是 IExtractIcon 代码:

HRESULT CShellIcon::GetIconLocation(UINT uFlags, LPWSTR szIconFile, UINT cchMax, LPINT piIndex, UINT* pwFlags)
{ 
    // I inject the dll to subclass the desktop window
    SubclassDesktop();

    *piIndex = 0; 

    *pwFlags = GIL_DONTCACHE | GIL_NOTFILENAME | GIL_PERINSTANCE;
    return S_FALSE;
} 

HRESULT CShellIcon::Extract(LPCTSTR pszFile, UINT nIconIndex, HICON* phiconLarge, HICON* phiconSmall, UINT nIconSize )
{ 
    phiconLarge = NULL;
    phiconSmall = NULL;
    return S_OK; 
}
4

0 回答 0