2012-11-16 48 views
0

我使用python2.7和py2exe從我的python腳本創建dll。圖標覆蓋窗口不反映在資源管理器中

成功創建了DLL併爲我的圖標疊加狀態註冊了一個條目,然後通過任務管理器重新啓動了Windows資源管理器進程。

驗證我的入口是否在註冊表中,是的,它在那裏。

但是,當我通過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) 

回答

0

這真是痛苦獲得工作的權利,好運!

我相信Windows只會允許註冊10個不同的圖標,並且它只會與前10個按字母順序註冊的工作。你已經有10個註冊?如果您安裝了Dropbox,tortoise-svn等,因爲每個圖像都被視爲條目,所以超過10個很容易。如果是這種情況,請在名稱前加上一個下劃線或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) 
+0

我在Windows 7工作。我確保我的應用程序條目首先列在註冊表中以獲得優先級。我的問題是相同的python腳本在作爲腳本進行測試時效果很好,並且將其轉換爲dll,這些dll在測試時無法正常運行。如果你告訴我一些想法,可能會出現循環漏洞,這對我來說是一個很大的幫助。給我一個適合你的樣品。 –

相關問題