天天看点

桌面外壳API之小技巧一枚

标志位SHGFI_USEFILEATTRIBUTES的用法

对于Windows桌面外壳API SHGetFileInfo来说,你可以向它传递一个特殊的标志位SHGFI_USEFILEATTRIBUTES。那么,这个标志位是什么意思呢?

Well,它的意思是告诉Windows外壳:请不要访问磁盘,并且假装我指定的文件/文件夹存在,并且文件/文件夹的属性是我传递给你的dwFileAttributes参数。请不要管文件/文件夹是否真实存在,按我说的做就行了。

这个标志位的一个使用场景是,你可以通过它来获取某种文件类型的图标。举个例子,为了获取文本文件类型的图标,你可以向SHGetFileInfo传递一个文件名”x.txt”,并在它的uFlags中使用SHGFI_USEFILEATTRIBUTES,同时,指定文件的属性为FILE_ATTRIBUTE_NORMAL。

为什么需要使用文件名”x.txt”?

因为你需要得到的是一个文本类型文件的图标,并且你希望它是一个有效合法的文件名。

(请不要向它传递一个无效的文件名,例如”???.txt”)

为什么使用FILE_ATTRIBUTE_NORMAL作为文件属性?

因为你希望SHGetFileInfo假装它是一个普通文件,如果你传递FILE_ATTRIBUTE_DIRECTORY,则你会得到文件夹的图标,因为你通过此参数告诉SHGetFileInfo假装”x.txt”是一个文件夹,而不是文件。

请注意,因为这个假装的动作,某些动态的属性信息可能无法获取。举个例子,如果某个文件类型的图标是根据文件的内容动态变化的,则这动态变化的图标不会被返回,因为,毕竟,你是告诉API要假装文件存在,而一个虚构的文件根本不会存在任何内容。

总结

最后