Наложение значков в окнах не отображается в проводнике
Я использую python2.7 и py2exe для создания DLL из моего скрипта Python.
Успешно создал DLL и зарегистрировал запись для моего состояния наложения значков, а затем перезапустил процесс Windows Explorer через диспетчер задач.
Проверено, есть ли моя запись в реестре и да, она была там.
Но когда я устанавливаю свой статус через скрипт тестового приложения Python для определенной папки.
Я ожидал, что все файлы и папки по выбранному пути должны быть наложены на мой значок наложения.
Но нет, значок наложения не происходит вообще.
Но когда я тестирую через скрипт Python для записи в регистр (без создания DLL) и устанавливаю мой значок наложения через мой скрипт тестового приложения.
Да, это работает отлично.
Я запутался, почему это не происходит, когда пытался с моей DLL???
Ниже мой скрипт на python для регистрации статуса записи
import os
import win32traceutil
import pythoncom
import winerror
from win32com.shell import shell, shellcon
from multiprocessing.connection import Client
REG_PATH = r'Software\Microsoft\Windows\CurrentVersion\Explorer\ShellIconOverlayIdentifiers'
REG_KEY = "IconOverlayTest"
class IconOverlay:
_reg_desc_ = 'Icon Overlay COM Server'
_public_methods_ = ['GetOverlayInfo', 'GetPriority','IsMemberOf']
_com_interfaces_ = [shell.IID_IShellIconOverlayIdentifier, pythoncom.IID_IDispatch]
def __init__(self, *_args, **_kwargs):
self._icon = None
self._icon_id = None
raise NotImplementedError
def GetOverlayInfo(self):
return self._icon, 0, shellcon.ISIOI_ICONFILE
def GetPriority(self):
return 0
def IsMemberOf(self, path, _attrs):
if is_member(path, self._icon_id):
return winerror.S_OK
return winerror.E_FAIL
class IconOverlay_test(IconOverlay):
_reg_progid_ = 'a.TestServer1'
_reg_clsid_ = '{8B19F050-8354-11E1-A0FE-5C260A5D15E4}'
def __init__(self):
self._icon = "C:\\Users\\Administrator\\mat\\icon_overlay\\icons\\1.ico"
self._icon_id = 101
classes = [IconOverlay_test,]
def is_member(path, icon_id):
try:
conn = None
conn = Client("\\\\.\\pipe\\test.listener", "AF_PIPE")
conn.send(path)
if conn.poll(3):
reply = conn.recv()
return reply == icon_id
except Exception:
pass
finally:
conn and conn.close()
return False
def DllRegisterServer():
print("Registering %s ......."%IconOverlay._reg_desc_)
import winreg
#winreg = _winreg
for view in [winreg.KEY_WOW64_64KEY, winreg.KEY_WOW64_32KEY]:
for cls in classes:
with winreg.CreateKeyEx(winreg.HKEY_LOCAL_MACHINE, r"%s\%s" %
(REG_PATH, cls._reg_progid_), 0,
winreg.KEY_ALL_ACCESS|view) as hkey:
print(" %s"%cls)
winreg.SetValueEx(hkey, None, 0, winreg.REG_SZ, cls._reg_clsid_)
print("Registration complete: %s" % IconOverlay._reg_desc_)
def DllUnregisterServer():
print("Unregistering %s ......."%IconOverlay._reg_desc_)
import winreg
#winreg = _winreg
for view in [winreg.KEY_WOW64_64KEY, winreg.KEY_WOW64_32KEY]:
for cls in classes:
try:
_key = winreg.DeleteKeyEx(winreg.HKEY_LOCAL_MACHINE, r"%s\%s"
% (REG_PATH, cls._reg_progid_),
winreg.KEY_ALL_ACCESS|view)
except WindowsError as err:
if err.errno != 2:
raise
print("Unregistration complete: %s" % IconOverlay._reg_desc_)
if __name__ == '__main__':
from win32com.server import register
register.UseCommandLine(*classes,
finalize_register = DllRegisterServer,
finalize_unregister = DllUnregisterServer)
1 ответ
Это действительно больно, чтобы работать правильно, удачи!
Я полагаю, что окна позволят зарегистрировать только 10 различных значков и будут работать только с первыми 10 зарегистрированными в алфавитном порядке. У вас уже есть 10 зарегистрированных? Превышение 10 довольно легко, если у вас установлены dropbox, tortoise-svn и т. Д., Поскольку каждое изображение считается записью. Если это так, попробуйте поставить знак подчеркивания или 0 перед именем, чтобы убедиться, что оно получает приоритет, хотя это будет означать, что другой значок потеряет силу - я не думаю, что есть способ обойти это.
Также иногда окна не знают, как обновить статус иконки. Какую версию Windows вы используете? Некоторые хуже, чем другие. Кажется, я помню, что XP не очень хорош в этом. Есть некоторые хитрости, чтобы заставить его обновиться, вы можете обновить окно через windows api, но это выглядит ужасно, и весь проводник мигает. Лучший способ, который я нашел, это изменить атрибут файла. Это трюк, который я использовал:
import stat,os
file_att= os.stat(path)[0]
if file_att & stat.S_IWRITE:
os.chmod(path,stat.S_IREAD)
os.chmod(path,stat.S_IWRITE)
else:
os.chmod(path,stat.S_IWRITE)
os.chmod(path,stat.S_IREAD)