我在 Windows 桌面窗口中有一个文件。我想自定义绘制它而不是普通的图标和文本。我几乎通过以下步骤来实现它,1.制作一个实现IExtractIcon接口的dll,然后为该文件注册一个图标处理程序shell扩展名,以使该dll由explorer.exe加载。2.在dll的dllmain函数中,子类化桌面窗口,进行自定义绘图。
这几乎可行,但仍然存在一些问题: 1. 在 winxp 中,dll 仅加载一次。重新启动PC后,不会加载dll,除非我制作了另一个具有相同扩展名的文件。我猜原因是桌面已经缓存了图标,所以它不需要加载 dll 来提取图标。但是为什么win7有效。我该怎么做才能使系统始终加载 dll?
- 该文件在文件系统中总是有一个扩展名,但是当它显示在桌面上时,可能不会显示该扩展名。如何根据桌面列表视图项获取文件的全名?
或者有没有其他方法可以让 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;
}