Пример работы наложенных иконок win32com

Я пытаюсь сделать что-то похожее на синхронизацию папки Dropbox, и у меня возникают проблемы с добавлением значков наложения. Я проверил следующие руководства:

http://timgolden.me.uk/python/win32_how_do_i/add-my-own-icon-overlays.html http://msdn.microsoft.com/en-us/library/bb776858%28VS.85%29.aspx?topic=306117

После этого я сделал всего несколько небольших изменений в примере Голдена: 1. В методе IsMemberOf я хочу добавить значок наложения только в одну папку на моем рабочем столе, содержащую файл "kala.txt". 2. в методе GetOverlayInfo я изменил путь, чтобы указать на значок, который я имею в моих загрузках.

После запуска кода я проверил реестр, и ключ там есть, но значок не будет отображаться. Я нахожусь на 32-битной Windows XP виртуальной машине.

Код:

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

class IconOverlay:
    _reg_clsid_ = '{642A09BF-DE34-4251-A0C2-588CCE0DB935}'
    _reg_progid_ = 'TJG.PythonPackagesOverlayHandler'
    _reg_desc_ = 'Icon Overlay Handler to indicate Python packages'
    _public_methods_ = ['GetOverlayInfo', 'GetPriority', 'IsMemberOf']
    _com_interfaces_ = [shell.IID_IShellIconOverlayIdentifier]

    def GetOverlayInfo(self):
        return (r'C:\Users\Administrator\Downloads\netvibes.ico', 0, shellcon.ISIOI_ICONFILE)

    def GetPriority(self):
        return 1

    def IsMemberOf(self, fname, attributes):
        if os.path.exists(os.path.join(fname, 'kala.txt')):
            return winerror.S_OK
        return winerror.E_FAIL

if __name__=='__main__':
    import win32api
    import win32con
    import win32com.server.register
    win32com.server.register.UseCommandLine (IconOverlay)
    keyname = r'Software\Microsoft\Windows\CurrentVersion\Explorer\ShellIconOverlayIdentifiers\PyPackageOverlay'
    key = win32api.RegCreateKey (win32con.HKEY_LOCAL_MACHINE, keyname)
    win32api.RegSetValue (key, None, win32con.REG_SZ, IconOverlay._reg_clsid_)

2 ответа

Решение

Я решил проблему:

Перед регистрацией обработчика необходимо удалить существующий обработчик с таким же именем. Это можно сделать, запустив> regedit >, перейдите в раздел "Программное обеспечение \Microsoft\Windows\CurrentVersion\Explorer\ShellIconOverlayIdentifiers\ > и удалите обработчик с таким же именем".

После этого можно добавить новый обработчик.

Чтобы заставить обработчик работать, вы должны убить процесс explorer.exe и перезапустить его.

Я не вижу проблем с вашим кодом, но вот несколько вещей, которые нужно проверить:

  1. Посмотрите, работает ли оригинальный код из примера (скачайте значок, использованный в примере и т. Д.); если нет, то в вашей версии windows что-то другое.
  2. Увеличьте приоритет, чтобы соответствовать примеру, он использует 50 и не ясно, как значение влияет на функцию.
  3. Убедитесь, что значок имеет правильный формат, открыв значок и пример в редакторе значков.
Другие вопросы по тегам