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

4

我想要的

我正在尝试编写一个函数,它接受一个文件名作为输入,并返回与该文件类型关联的应用程序图标(我的系统是Windows 7)。

我所尝试过的

我看到了这个问题,但答案并没有给我需要的细节。我对ctypes模块不太熟悉,我发现VC ++函数的文档难以理解。

我还看到了这个问题,但我卡在了第一个障碍上。当我尝试时:

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

代码出现 WindowsError: [Error 2] The system cannot find the file specified

即使我这样做:

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

调用该函数会返回一个PyHKEY对象,但是对其进行任何“key”操作时都会引发TypeError:该对象不是PyHKEY对象


包含反斜杠的字符串字面值需要将它们全部加倍,或者使用 r(原始字符串)前缀。例如:'Software\\Microsoft'r'Software\Microsoft' - martineau
“isn't giving me the details I need” 是什么意思? - abarnert
@martineau 说得好,但在这种情况下,斜杠会自动转义,r''没有任何区别。 - Griffin
@abarnert 主要是如何使用ExtractIconA函数。 - Griffin
2个回答

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()

我对我的前辈们用超级hacky的方式解决的问题非常感兴趣。不幸的是,你的解决方案甚至无法编译-路径未定义(win32ui也是如此),Image不是标准导入等。请纠正它并添加一些关于你正在做什么的注释,我会点赞的。 - Mr_and_Mrs_D
1
@Mr_and_Mrs_D,这对我有效。也许在你的端上修复一下问题再进行投票? - Griffin
@Mr_and_Mrs_D 他说的并不太离谱,如果你还需要的话,可以看看我的答案。 - Spencer

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 )

1
这给了我Traceback (most recent call last): File "<pyshell#3>", line 1, in <module> save_icon(r"C:\Users\jakub\Desktop\GitHub Desktop.lnk", "out") File "C:\Users\jakub\Desktop\python\grab_icon.py", line 12, in save_icon win32gui.DestroyIcon(large[0]) IndexError: list index out of range - Jakub Bláha

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接