我可以根据系统文件中某处的不同系统加载默认 Windows 图标吗
Posted
技术标签:
【中文标题】我可以根据系统文件中某处的不同系统加载默认 Windows 图标吗【英文标题】:Can I load a default windows icon depending on different system from somewhere in the sytem files 【发布时间】:2013-09-30 06:23:42 【问题描述】:具体来说,我正在尝试编写一个在不同的 Windows 系统上运行的 Windows 程序,主要是 XP 和 Win7 或 Win8。我希望它从系统文件中的某处加载系统默认图标(我也不知道)。这可能吗?我该怎么做?
例如,Text.txt 文件在 Windows XP 上有它的图标,但在 Win7 上有不同的图标。 XP的回收站也不同于Win7的回收站。那么我在哪里可以将这个与系统相关的图标加载到我的程序中呢? ps 我使用的是 VC6,而不是 .NET。
【问题讨论】:
参见例如SHGetStockIconInfo
(虽然在 XP 上不可用,但它可能会提示您要查找的内容。)
【参考方案1】:
如果您想要特定类型文件的图标,您可以使用SHGetFileInfo
。例如,获取文本文件的图标:
SHFILEINFO sfi;
if (SHGetFileInfo(L".txt", FILE_ATTRIBUTE_NORMAL, &sfi, sizeof(sfi), SHGFI_ICON | SHGFI_USEFILEATTRIBUTES ))
// you now have the icon in sfi.hIcon
// remember to destroy it when you are done with it
DestroyIcon(sfi.hIcon);
SHGFI_ICON
标志表示我们想要大图标。您可以添加SHGFI_SMALLICON
标志来获取小图标。
SHGFI_USEFILEATTRIBUTES
表示我们传递的文件名不必存在 - 该函数将返回文件类的图标,而不是特定现有文件的图标。如果您想要特定文件的图标,则将文件的完整路径名传递给 SHGetFileInfo
函数并省略此标志。
如果你想要一个系统文件夹的图标,比如回收站,这个功能也可以做到。例如:
LPITEMIDLIST pidl;
if (SUCCEEDED(SHGetFolderLocation(0, CSIDL_BITBUCKET, 0, 0, &pidl)))
SHFILEINFO sfi;
if (SHGetFileInfo((LPCWSTR)pidl, 0, &sfi, sizeof(sfi), SHGFI_ICON | SHGFI_PIDL))
// you now have the icon in sfi.hIcon
// remember to destroy it when you are done with it
DestroyIcon(sfi.hIcon);
CoTaskMemFree(pidl);
请参阅SHGetFileInfo
的文档以获取完整的标志列表。在使用这些函数之前,请确保您已调用 OleInitialize()
或 CoInitializeEx()
来初始化 COM。
【讨论】:
非常感谢!我是编程新手。我是否使用 LoadIcon(NULL, LPCTSTR) 函数将 sfi.hIcon 加载到我的程序中?但是如何转换第二个参数呢? 不,sfi.hIcon
已经加载 - 您可以在像 DrawIconEx()
这样的调用中使用它。
此外,我认为我的 VC6 太旧了,因此在编译时,它说 SHGetFolderLocation 是未声明的标识符,并且 SHGetFileInfoA 也无法将参数 1 从“const unsigned short *”转换为“const char *”。有什么解决办法吗??
我不想画它。我想用它作为我程序的图标。我只从资源中知道 LoadIcon。但是不知道如何加载这个 sfi.hIcon 作为我程序的图标?
如果你想用它作为你程序的图标,你应该在你的问题中说,因为这是一个完全不同的主题。您不能以编程方式执行此操作 - 程序的图标存储在 EXE 文件本身的资源中。以上是关于我可以根据系统文件中某处的不同系统加载默认 Windows 图标吗的主要内容,如果未能解决你的问题,请参考以下文章
如何在Xamarin viewcell或Grid或某处显示默认文件扩展名图标?
装daemon tools 或者 Virtual CloneDrive 无法加载光盘映像,也看不到虚拟的盘符,我的系统是win7 32位
ASP.Net网站 未能加载文件或程序集 每次发布网站提示不同的程序集名 我使用VS2010,.Net3.5框架,32位的Win7