获取文件的关联文件类型图标

4 投票
2 回答
3319 浏览
提问于 2025-04-18 18:36

我想要做什么

我想写一个函数,这个函数可以接收一个文件名,然后返回与这个文件类型相关联的应用程序图标(我用的是Windows 7系统)。

我尝试过什么

我看到过这个问题,但是答案没有给我我需要的细节。我对ctypes模块不太熟悉,而且觉得VC++函数的文档很难理解。

我还看到过这个问题,但我在第一步就遇到了困难。当我尝试:

import _winreg
_winreg.OpenKey(_winreg.HKEY_CURRENT_USER, 'Software\Microsoft\CurrentVersion\Explorer\FileExts')

它抛出了一个错误:WindowsError: [Error 2] 系统找不到指定的文件

即使我这样做:

_winreg.OpenKey(_winreg.HKEY_CURRENT_USER, 'Software\Microsoft')

这返回了一个PyHKEY对象,但我对它进行的任何“键”操作都会抛出一个错误:TypeError: 这个对象不是PyHKEY对象

2 个回答

0

这里有一些可以运行的Python 2代码给你。虽然我并不完全理解里面发生的所有事情,但我可以肯定地说,这段代码确实是有效的!

import win32ui
import win32gui
import win32con
import win32api


def save_icon(exe_file, out_file):
    ico_x = win32api.GetSystemMetrics(win32con.SM_CXICON)
    ico_y = win32api.GetSystemMetrics(win32con.SM_CYICON)

    large, small = win32gui.ExtractIconEx(exe_file, 0)
    win32gui.DestroyIcon(large[0])

    hdc = win32ui.CreateDCFromHandle(win32gui.GetDC(0))
    hbmp = win32ui.CreateBitmap()
    hbmp.CreateCompatibleBitmap( hdc, ico_x, ico_y )
    hdc = hdc.CreateCompatibleDC()

    hdc.SelectObject( hbmp )
    hdc.DrawIcon( (0,0), small[0] )
    hbmp.SaveBitmapFile( hdc, out_file )
0

我在这里找到了解答 链接

链接中的代码是:

import win32ui
import win32gui
import win32con
import win32api
import cStringIO
import Image

tempDirectory = os.getenv("temp")
ico_x = win32api.GetSystemMetrics(win32con.SM_CXICON)

dst = cStringIO.StringIO()

large, small = win32gui.ExtractIconEx(path,0)
win32gui.DestroyIcon(small[0])

#creating a destination memory DC
hdc = win32ui.CreateDCFromHandle( win32gui.GetDC(0) )
hbmp = win32ui.CreateBitmap()
hbmp.CreateCompatibleBitmap(hdc, ico_x, ico_x)
hdc = hdc.CreateCompatibleDC()

hdc.SelectObject( hbmp )

#draw a icon in it
hdc.DrawIcon( (0,0), large[0] )
win32gui.DestroyIcon(large[0])

#convert picture
hbmp.SaveBitmapFile( hdc, tempDirectory + "\Icontemp.bmp")

im = Image.open(tempDirectory + "\Icontemp.bmp")
im.save(dst, "JPEG")

dst.seek(0)

os.remove(tempDirectory + "\Icontemp.bmp")    
return dst.read()

撰写回答