windows根据扩展名找对应的图标

引言

最近做的MyTools想可以自定义启动任何程序,甚至是word文档,那么前面的图标该怎么获取到是个问题,问问度娘好像也没看出什么有用的东西,有个pypiwin32的,但是py3没有安上,就没有再试了,自己想办法了。

思考过程

  1. 扩展名和打开方式存储在注册表中,所以方向定位到注册表
  2. 找到textfile,发现有一项指向了一个Exe文件,所以可以通过exe获取到icon
    image.png
  3. 全局搜索注册表textfile看看有没有对应的扩展名.txt
    image.png
    S-1-5-21-143525665-3044134838-379703025-1001 感觉可能不能满足所有人
    Wordpad 和 系统自带的有关,肯定不适配所有格式
  4. 经过排除,感觉HKEY_CURRENT_USER\SOFTWARE\Microsoft\Windows\CurrentVersion\ApplicationAssociationToasts最像了
  5. 找到关键字textfile_.txt
    image.png
  6. 此时可以根据.txt前面的textfile去HKEY_CLASSES_ROOT 查textfile,里面的FriendlyTypeName 就可以找到对应的执行文件了

有待证实。

测试过程

image.png
直接根据.txt的默认值去找就是默认打开方式
不需要HKEY_CURRENT_USER\SOFTWARE\Microsoft\Windows\CurrentVersion\ApplicationAssociationToasts找,HKEY_CURRENT_USER\SOFTWARE\Microsoft\Windows\CurrentVersion\ApplicationAssociationToasts里面是所有的打开方式,比如说mp3可以通过au,vlc,kugou,网易云等打开,这里面存的就是全量的支持打开对应格式的软件。

有待证实

结论

证明代码:

import win32api
import win32con

key = win32api.RegOpenKey(win32con.HKEY_CLASSES_ROOT, "", 0, win32con.KEY_READ)

for item in win32api.RegEnumKeyEx(key):
    fmt = item[0]
    if fmt.startswith('.'):
        ffmt = win32api.RegQueryValue(win32api.RegOpenKey(win32con.HKEY_CLASSES_ROOT, fmt, 0, win32con.KEY_READ), '')
        if ffmt == '':
            continue
        try:
            exe = win32api.RegQueryValueEx(
                win32api.RegOpenKey(win32con.HKEY_CLASSES_ROOT, ffmt + "\DefaultIcon\\", 0, win32con.KEY_READ), '')
            print(item[0], "-->", ffmt, '-->', exe)
        except Exception as e:
            pass

看起来挺多的

image.png

评论 0

还没有评论,来说点什么吧。

提交后需要审核才会公开。