Python图标重叠问题 [英] Icon overlay issue with Python

查看:161
本文介绍了Python图标重叠问题的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我在这个论坛上发现了一些例子和主题,如何实现一个图标覆盖处理程序与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\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))
如果os.path.basename(fname) =hello.text:
return winerror.S_OK
return winerror.E_FAIL

def DllRegisterServer():
print注册%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, _winreg.REG_SZ,GdClass._reg_clsid_)
print注册完成:%s%GdClass._reg_desc_

def DllUnregisterServer():
print取消注册%s%REG_KEY
import _winreg
try:
key = _winreg.DeleteKey(_winreg.HKEY_LOCAL_MACHINE,r%s\%s%(REG_PATH,GdClass._reg_progid_))
WindowsError,详细信息:
import errno
如果details.errno!= errno.ENOENT:
raise
print取消注册完成:%s%GdClass._reg_desc_

如果__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



您可以下载所有代码< a href =http://kobiarts.free.fr/python/iconoverlay.zip =nofollow>此处:

解决方案

问题解决。



我的愿望是创建一个类似dropBox服务的东西。



i需要能够根据其上传状态更新给定文件的图标。我将为每个状态(上传,上传,失败)创建一个类,它将实现IID_IShellIconOverlayIdentifier接口。但是...



应该将当前正在上传/ failed_to_upload的文件列表写入本地文件中,检查每个文件是否存在isMemberOf方法以确定好图标显示?这是最好的方法,或者它会更好的例如存储在注册表中的一个键的所有文件路径。



感谢您的帮助。 p>

I found some examples and topics on this forum about the way to implement an icon overlay handler with Python 2.7 & the win32com package but it does not work for me and I don't understand why.

I create the DLL and I have no error when I register it. I have also tried directly with the script but it's the same. It's like the class is never called.

Here is the code:

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)


Hi and thanks for your answer. I have tested with a log file and also win32traceutil. The registration/unregitration messages are logged. The registry entries are also created under:

1/HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Explorer\ShellIconOverlayIdentifiers\GD.TestServer 2/ HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Shell Extensions\Approved 3/ directly under class root.

I have also added some logs inside the methods getOverlayInfo, GetPriority and isMemberOf but I can't see a trace when I browse through the explorer.

My configuration is: Python 2.7 pywin32-214.win32-py2.7.exe Windows XP SP 2

You can download all the code here:

解决方案

problem solved. i guess something was badly initialized but now it works.

My wish is to make something like the dropBox service.

i need to be able to update the icon of a given file according to its upload status. I will create a class for each state (uploading, uploaded, failed) that will implements the IID_IShellIconOverlayIdentifier interface. But then...

should i write the list of files that are currently uploading/failed_to_upload in local files the check the presence of each file into the isMemberOf method to determine the good icon to display? Is it the best way to do that or it would be better for instance to store all the file path inside a key in the registry?

Thanks for your help.

这篇关于Python图标重叠问题的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆