setup_menu.py 1.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172
  1. import ctypes
  2. import winreg
  3. import sys
  4. import os
  5. import logging
  6. # 设置日志等级(注释掉可完全静默)
  7. def add_context_menu(name: str, exe_path: str, icon_path: str = None):
  8. """添加右键菜单"""
  9. key_path = fr"*\\shell\\{name}"
  10. try:
  11. key = winreg.CreateKey(winreg.HKEY_CLASSES_ROOT, key_path)
  12. winreg.SetValueEx(key, "", 0, winreg.REG_SZ, name)
  13. if icon_path:
  14. winreg.SetValueEx(key, "Icon", 0, winreg.REG_SZ, icon_path)
  15. command_key = winreg.CreateKey(key, "command")
  16. winreg.SetValueEx(command_key, "", 0, winreg.REG_SZ, f'"{exe_path}" "%1"')
  17. winreg.CloseKey(key)
  18. except Exception as e:
  19. pass
  20. def remove_context_menu(name: str):
  21. """删除右键菜单"""
  22. key_path = fr"*\\shell\\{name}"
  23. try:
  24. winreg.DeleteKey(winreg.HKEY_CLASSES_ROOT, key_path + r"\command")
  25. winreg.DeleteKey(winreg.HKEY_CLASSES_ROOT, key_path)
  26. except Exception as e:
  27. pass
  28. def is_admin():
  29. try:
  30. return ctypes.windll.shell32.IsUserAnAdmin()
  31. except:
  32. return False
  33. def relaunch_as_admin():
  34. """尝试以管理员权限重新运行当前脚本"""
  35. params = ' '.join(f'"{arg}"' for arg in sys.argv)
  36. ctypes.windll.shell32.ShellExecuteW(None, "runas", sys.executable, params, None, 0)
  37. def main():
  38. if len(sys.argv) < 3:
  39. return
  40. command = sys.argv[1].lower()
  41. name = sys.argv[2]
  42. if command == "install":
  43. if len(sys.argv) < 4:
  44. return
  45. exe_path = os.path.abspath(sys.argv[3])
  46. icon_path = os.path.abspath(sys.argv[4]) if len(sys.argv) >= 5 else exe_path
  47. add_context_menu(name, exe_path, icon_path)
  48. elif command == "uninstall":
  49. remove_context_menu(name)
  50. if __name__ == "__main__":
  51. if not is_admin():
  52. relaunch_as_admin()
  53. sys.exit()
  54. main()