具体来说,我正在尝试编写一个在不同的 Windows 系统上运行的 Windows 程序,主要是 XP 和 Win7 或 Win8。我希望它从系统文件中的某处加载系统默认图标(我也不知道)。这可能吗?我该怎么做?
例如,Text.txt 文件在 Windows XP 上有它的图标,但在 Win7 上有不同的图标。XP的回收站也不同于Win7的回收站。那么我在哪里可以将这个与系统相关的图标加载到我的程序中呢?ps 我使用的是 VC6,而不是 .NET。
具体来说,我正在尝试编写一个在不同的 Windows 系统上运行的 Windows 程序,主要是 XP 和 Win7 或 Win8。我希望它从系统文件中的某处加载系统默认图标(我也不知道)。这可能吗?我该怎么做?
例如,Text.txt 文件在 Windows XP 上有它的图标,但在 Win7 上有不同的图标。XP的回收站也不同于Win7的回收站。那么我在哪里可以将这个与系统相关的图标加载到我的程序中呢?ps 我使用的是 VC6,而不是 .NET。
如果您想要特定类型文件的图标,您可以使用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。