这是一个很长的机会,但有人知道一个工作方法来获得相关的图标位置(=路径到一个exe/dll/ico文件)和ID的给定文件名与WinAPI。关键是创建一个快捷方式到另一个文件(可能是或可能不是相同的文件类型),并设置这个确切的图标,覆盖其默认的,大概与IShellLink::SetIconLocation。
不起作用的事情:- 提取关联图标-SH获取文件信息-I提取图标
对于我尝试过的任何默认文件类型(如txt),返回带有GIL_NOTFILENAME标志的随机垃圾。
SO上似乎有几个关于这类事情的主题,答案/非答案暗示了上述之一。这个1(https://stackoverflow.com/questions/39373357/how-to-get-the-icon-path-and-index-associated-with-a-file-type)似乎最接近于提供信息。他们首选的方法也不起作用,但他们的其他注解给了我尝试使用注册表的提示。
因此,就目前而言,我编写了自己的函数,使用注册表2(https://gist.github.com/Liniya/0fe663a1d1e9941c84a6be2e0bb10243),但它也不完美:在某些情况下,注册表存储的“正图标ID”似乎不能与SetIconLocation一起使用。
老实说,没想到这会是这样一个2023年的问题
1条答案
按热度按时间wgeznvg71#
如果你不想覆盖目标的默认图标,你不需要调用
IShellLink::SetIconLocation
,只要将快捷方式指向一个.txt文件,快捷方式就会自动得到正确的图标。肯定的图标ID可以用于
SetIconLocation
,这是常见的情况。您调用PathParseIconLocation
吗?GIL_NOTFILENAME
是你必须接受的,它通常意味着图标来自系统映像列表。shell主要关注的是从文件/类型到HICON,而不是相反。文件的图标甚至可能是dynamic if it is implemented by a shell extension。你可以把
AssocQueryString
添加到要尝试的函数列表中,这些函数永远不会100%工作...