93 lines
2.6 KiB
Python
93 lines
2.6 KiB
Python
import os
|
|
import sys
|
|
import logging
|
|
import winreg
|
|
|
|
logger = logging.getLogger(__name__)
|
|
|
|
REG_KEY = r"Software\Classes\Directory\Background\shell\RefreshWallpaper"
|
|
COMMAND_KEY = REG_KEY + r"\command"
|
|
|
|
MENU_NAME = "刷新壁纸(&R)"
|
|
|
|
|
|
def _is_frozen() -> bool:
|
|
return getattr(sys, 'frozen', False) or '__compiled__' in sys.modules
|
|
|
|
|
|
def _get_app_dir() -> str:
|
|
if _is_frozen():
|
|
return os.path.dirname(sys.executable)
|
|
return os.path.dirname(os.path.abspath(__file__))
|
|
|
|
|
|
def _get_command() -> str:
|
|
if _is_frozen():
|
|
return f'"{sys.executable}" --refresh'
|
|
else:
|
|
base = os.path.dirname(sys.executable)
|
|
pythonw = os.path.join(base, "pythonw.exe")
|
|
if not os.path.exists(pythonw):
|
|
pythonw = sys.executable
|
|
script = os.path.join(_get_app_dir(), "refresh.py")
|
|
return f'"{pythonw}" "{script}"'
|
|
|
|
|
|
def _get_icon_path() -> str:
|
|
return os.path.join(_get_app_dir(), "assets", "icon.ico")
|
|
|
|
|
|
def install() -> bool:
|
|
command = _get_command()
|
|
icon = _get_icon_path()
|
|
|
|
try:
|
|
key = winreg.CreateKey(winreg.HKEY_CURRENT_USER, REG_KEY)
|
|
winreg.SetValueEx(key, "", 0, winreg.REG_SZ, MENU_NAME)
|
|
if os.path.exists(icon):
|
|
winreg.SetValueEx(key, "Icon", 0, winreg.REG_SZ, icon)
|
|
winreg.CloseKey(key)
|
|
|
|
key = winreg.CreateKey(winreg.HKEY_CURRENT_USER, COMMAND_KEY)
|
|
winreg.SetValueEx(key, "", 0, winreg.REG_SZ, command)
|
|
winreg.CloseKey(key)
|
|
|
|
logger.info("Desktop right-click menu installed: %s", MENU_NAME)
|
|
return True
|
|
except Exception as e:
|
|
logger.error("Failed to install menu: %s", e)
|
|
return False
|
|
|
|
|
|
def uninstall() -> bool:
|
|
try:
|
|
key = winreg.OpenKey(winreg.HKEY_CURRENT_USER, REG_KEY)
|
|
winreg.CloseKey(key)
|
|
except FileNotFoundError:
|
|
logger.info("Menu not installed, nothing to uninstall")
|
|
return True
|
|
|
|
try:
|
|
winreg.DeleteKey(winreg.HKEY_CURRENT_USER, COMMAND_KEY)
|
|
logger.info("Deleted registry key: %s", COMMAND_KEY)
|
|
except Exception as e:
|
|
logger.warning("Failed to delete command key: %s", e)
|
|
|
|
try:
|
|
winreg.DeleteKey(winreg.HKEY_CURRENT_USER, REG_KEY)
|
|
logger.info("Deleted registry key: %s", REG_KEY)
|
|
except Exception as e:
|
|
logger.error("Failed to delete menu key: %s", e)
|
|
return False
|
|
|
|
logger.info("Desktop right-click menu uninstalled")
|
|
return True
|
|
|
|
|
|
if __name__ == "__main__":
|
|
logging.basicConfig(level=logging.INFO)
|
|
if len(sys.argv) > 1 and sys.argv[1] == "uninstall":
|
|
uninstall()
|
|
else:
|
|
install()
|