Python图标叠加问题

6 投票
1 回答
1490 浏览
提问于 2025-04-16 10:28

我在这个论坛上找到了一些关于如何用Python 2.7和win32com包实现图标叠加处理程序的例子和话题,但对我来说都不管用,我也不明白为什么。

我创建了DLL文件,并且在注册时没有出现错误。我也尝试直接用脚本,但结果一样。感觉这个类根本没有被调用。

以下是代码:

import win32traceutil

from win32com.shell import shell, shellcon
import pythoncom
import winerror
import os

REG_PATH =r'Software\Microsoft\Windows\CurrentVersion\Explorer\ShellIconOverlayIdentifiers'
REG_KEY = "GdIconOverlayTest"

class GdClass:
    _reg_clsid_='{512AE200-F075-41E6-97DD-48ECA4311F2E}'
    _reg_progid_='GD.TestServer'
    _reg_desc_='gd desc'
    _public_methods_ = ['GetOverlayInfo','GetPriority','IsMemberOf']
    _com_interfaces_=[shell.IID_IShellIconOverlayIdentifier, pythoncom.IID_IDispatch]

    def __init__(self):
        pass

    def GetOverlayInfo(self):
        return (os.path.abspath(r'C:\icons\test.ico'), 0, shellcon.ISIOI_ICONFILE)

    def GetPriority(self):
        return 0

    def IsMemberOf(self, fname, attributes):
        print('ismemberOf', fname, os.path.basename(fname))
        if os.path.basename(fname) == "hello.text":
            return winerror.S_OK
        return winerror.E_FAIL

def DllRegisterServer():
    print "Registering %s" % REG_KEY
    import _winreg
    key = _winreg.CreateKey(_winreg.HKEY_LOCAL_MACHINE, REG_PATH)
    subkey = _winreg.CreateKey(key, GdClass._reg_progid_)
    _winreg.SetValueEx(subkey, None, 0, _winreg.REG_SZ, GdClass._reg_clsid_)
    print "Registration complete: %s" % GdClass._reg_desc_

def DllUnregisterServer():
    print "Unregistering %s" % REG_KEY
    import _winreg
    try:
        key = _winreg.DeleteKey(_winreg.HKEY_LOCAL_MACHINE, r"%s\%s" % (REG_PATH, GdClass._reg_progid_))
    except WindowsError, details:
        import errno
        if details.errno != errno.ENOENT:
            raise
    print "Unregistration complete: %s" % GdClass._reg_desc_

if __name__=='__main__':
    from win32com.server import register
    register.UseCommandLine(GdClass,
                            finalize_register = DllRegisterServer,
                            finalize_unregister = DllUnregisterServer)

你好,谢谢你的回答。我用日志文件和win32traceutil进行了测试。注册和注销的消息都有记录。注册表项也在以下位置创建:

1/HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Explorer\ShellIconOverlayIdentifiers\GD.TestServer 2/ HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Shell Extensions\Approved 3/ 直接在类根下。

我还在getOverlayInfo、GetPriority和isMemberOf这些方法里添加了一些日志,但在浏览资源管理器时看不到任何记录。

我的配置是: Python 2.7 pywin32-214.win32-py2.7.exe Windows XP SP 2

你可以在这里下载所有代码 这里

1 个回答

0

问题解决了。我想是之前的某些东西初始化得不好,但现在可以用了。

我希望能做一个像Dropbox那样的服务。

我需要能够根据文件的上传状态来更新图标。我会为每种状态(上传中、已上传、上传失败)创建一个类,这些类会实现IID_IShellIconOverlayIdentifier接口。但是接下来……

我是不是应该把当前正在上传或上传失败的文件列表写到本地文件里,然后在isMemberOf方法中检查每个文件的存在性,以确定显示哪个图标?这样做是最好的方法吗?还是说把所有文件路径存储在注册表的一个键里会更好?

谢谢你的帮助。

撰写回答