Files
pythonwallpaper/install_menu.py
T
2026-07-31 12:51:28 +08:00

89 lines
2.5 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 _get_app_dir() -> str:
if getattr(sys, 'frozen', False):
return os.path.dirname(sys.executable)
return os.path.dirname(os.path.abspath(__file__))
def _get_command() -> str:
if getattr(sys, 'frozen', False):
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()