123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172 |
- import ctypes
- import winreg
- import sys
- import os
- import logging
- # 设置日志等级(注释掉可完全静默)
- def add_context_menu(name: str, exe_path: str, icon_path: str = None):
- """添加右键菜单"""
- key_path = fr"*\\shell\\{name}"
- try:
- key = winreg.CreateKey(winreg.HKEY_CLASSES_ROOT, key_path)
- winreg.SetValueEx(key, "", 0, winreg.REG_SZ, name)
- if icon_path:
- winreg.SetValueEx(key, "Icon", 0, winreg.REG_SZ, icon_path)
- command_key = winreg.CreateKey(key, "command")
- winreg.SetValueEx(command_key, "", 0, winreg.REG_SZ, f'"{exe_path}" "%1"')
- winreg.CloseKey(key)
- except Exception as e:
- pass
- def remove_context_menu(name: str):
- """删除右键菜单"""
- key_path = fr"*\\shell\\{name}"
- try:
- winreg.DeleteKey(winreg.HKEY_CLASSES_ROOT, key_path + r"\command")
- winreg.DeleteKey(winreg.HKEY_CLASSES_ROOT, key_path)
- except Exception as e:
- pass
- def is_admin():
- try:
- return ctypes.windll.shell32.IsUserAnAdmin()
- except:
- return False
- def relaunch_as_admin():
- """尝试以管理员权限重新运行当前脚本"""
- params = ' '.join(f'"{arg}"' for arg in sys.argv)
- ctypes.windll.shell32.ShellExecuteW(None, "runas", sys.executable, params, None, 0)
- def main():
- if len(sys.argv) < 3:
- return
- command = sys.argv[1].lower()
- name = sys.argv[2]
- if command == "install":
- if len(sys.argv) < 4:
- return
- exe_path = os.path.abspath(sys.argv[3])
- icon_path = os.path.abspath(sys.argv[4]) if len(sys.argv) >= 5 else exe_path
- add_context_menu(name, exe_path, icon_path)
- elif command == "uninstall":
- remove_context_menu(name)
- if __name__ == "__main__":
- if not is_admin():
- relaunch_as_admin()
- sys.exit()
- main()
|