摸鱼必备:超级老板键:可以隐藏多个窗口!

实用软件1周前更新 小编
5 0

先声明:代码由本人编写,但是由于本人代码编写不太规范,为了方便理解,所以让AI添加注释并且修改函数名
摸鱼必备:超级老板键:可以隐藏多个窗口!

介绍
超级老板键:可以隐藏窗口,一键恢复多个窗口,可以隐藏自身。如图,可以点左下角添加配置,可以添加多个老板键隐藏多个窗口。点击右边“捕获”可以自定义老板键,配置会保存在当前目录下。隐藏有三个选项,可以自己选择:隐藏老板键自身,隐藏最表层窗口和隐藏指定窗口(要写窗口标题)。配置好后点击”启动老板键“即可开始使用,有一键恢复窗口。

提供蓝奏云直接下载!
备注:因为我设置了无控制台(就是没有黑窗),所以360不知道为啥就报毒,各位不放心可以看看源码,或者自己反编译,spec也在附件中!,。以下内容便于检查人员反编译:python的打包版本:”””E:\练手项目\项目3老板键>python –version
Python 3.10.8
pyinstaller版本E:\练手项目\项目3老板键>pyinstaller -v
6.14.2″””
问题修复等内容
如果遇到问题或者bug可以打开老板键所在目录,底下会有log.txt文件,将文件和你的问题或bug发给我,我看到会处理。如果有其他想要的功能也可以私信我哦!
源代码:

  1. import os
  2. import sys
  3. # ---------- 隐藏控制台黑窗(仅 Windows)----------
  4. if sys.platform == "win32":
  5.     import ctypes
  6.     ctypes.windll.kernel32.FreeConsole()
  7. import tkinter as tk
  8. from tkinter import ttk, messagebox
  9. import threading
  10. import queue
  11. import json
  12. import logging
  13. # ---------- 依赖库 ----------
  14. import keyboard
  15. import pygetwindow as gw
  16. import win32gui
  17. import win32con
  18. import win32event
  19. import win32api
  20. import winerror
  21. # ---------- 日志配置(追加模式)----------
  22. LOG_FILE = os.path.join(os.path.dirname(os.path.abspath(__file__)), "log.txt")
  23. logging.basicConfig(
  24.     level=logging.INFO,
  25.     format='%(asctime)s - %(levelname)s - %(message)s',
  26.     handlers=[
  27.         logging.FileHandler(LOG_FILE, mode='a', encoding='utf-8')
  28.     ]
  29. )
  30. logger = logging.getLogger(__name__)
  31. CONFIG_FILE = "bosskey_config.json"
  32. # ---------- 进程互斥,防止多开 ----------
  33. MUTEX_NAME = "Global\\BossKeyAppMutex"
  34. mutex = win32event.CreateMutex(None, False, MUTEX_NAME)
  35. if win32api.GetLastError() == winerror.ERROR_ALREADY_EXISTS:
  36.     logger.warning("检测到已有实例运行,退出")
  37.     sys.exit(0)
  38. # ---------------------- 单个隐藏配置项的数据模型 ----------------------
  39. class HideConfigItem:
  40.     """
  41.     一个隐藏规则:包含启用状态、类型、快捷键、目标标题,以及运行时隐藏的窗口句柄
  42.     """
  43.     # 内部英文标识
  44.     HIDE_SELF = "self"          # 隐藏自身窗口
  45.     HIDE_TOPMOST = "topmost"    # 隐藏最表层窗口
  46.     HIDE_TARGET = "target"      # 隐藏指定标题窗口
  47.     # ★ 中文显示映射
  48.     TYPE_MAP = {
  49.         HIDE_SELF: "隐藏自身",
  50.         HIDE_TOPMOST: "隐藏最表层窗口",
  51.         HIDE_TARGET: "隐藏指定窗口"
  52.     }
  53.     REVERSE_MAP = {v: k for k, v in TYPE_MAP.items()}
  54.     def __init__(self, enable=True, hide_type=HIDE_TOPMOST, hotkey="", target_title=""):
  55.         self.enable = tk.BooleanVar(value=enable)
  56.         self.hide_type = tk.StringVar(value=hide_type)         # 内部英文
  57.         self.hotkey = tk.StringVar(value=hotkey)
  58.         self.target_title = tk.StringVar(value=target_title)
  59.         # ★ 用于界面显示的中文变量,与 hide_type 自动同步
  60.         self.type_display = tk.StringVar(value=self.TYPE_MAP.get(hide_type, "隐藏最表层窗口"))
  61.         # 当 type_display 变化时,更新 hide_type
  62.         self.type_display.trace("w", self._sync_hide_type)
  63.         # 运行时状态
  64.         self.hidden_hwnds = []
  65.         self.hidden_self = False
  66.     def _sync_hide_type(self, *args):
  67.         """将中文显示值转换为英文内部值"""
  68.         eng = self.REVERSE_MAP.get(self.type_display.get(), self.HIDE_TOPMOST)
  69.         if self.hide_type.get() != eng:
  70.             self.hide_type.set(eng)
  71.     def get_hidden_any(self):
  72.         if self.hide_type.get() == self.HIDE_SELF:
  73.             return self.hidden_self
  74.         elif self.hide_type.get() == self.HIDE_TOPMOST:
  75.             return len(self.hidden_hwnds) > 0 and win32gui.IsWindow(self.hidden_hwnds[0])
  76.         else:
  77.             return any(win32gui.IsWindow(hwnd) for hwnd in self.hidden_hwnds)
  78.     def to_dict(self):
  79.         return {
  80.             "enable": self.enable.get(),
  81.             "type": self.hide_type.get(),   # 保存英文标识
  82.             "hotkey": self.hotkey.get(),
  83.             "target_title": self.target_title.get()
  84.         }
  85.     @classmethod
  86.     def from_dict(cls, data):
  87.         item = cls(
  88.             enable=data.get("enable", True),
  89.             hide_type=data.get("type", cls.HIDE_TOPMOST),
  90.             hotkey=data.get("hotkey", ""),
  91.             target_title=data.get("target_title", "")
  92.         )
  93.         # 保证显示与内部值一致
  94.         item.type_display.set(cls.TYPE_MAP.get(item.hide_type.get(), "隐藏最表层窗口"))
  95.         return item
  96. class BossKeyApp:
  97.     def __init__(self, root, auto_start=False):
  98.         self.root = root
  99.         self.root.title("老板键 v3.0 - 多配置版")
  100.         self.root.geometry("620x550")
  101.         self.root.resizable(True, True)
  102.         self.root.protocol("WM_DELETE_WINDOW", self.on_closing)
  103.         self.auto_start = auto_start
  104.         # ---------- 动态配置列表 ----------
  105.         self.config_items = []
  106.         self.config_frames = []
  107.         # ---------- 状态 ----------
  108.         self.active = False
  109.         self.action_queue = queue.Queue()
  110.         self.registered_hotkeys = set()
  111.         self.self_hidden = False
  112.         self.load_config()
  113.         self.build_ui()
  114.         if self.auto_start:
  115.             self.root.after(500, self.auto_elevated_start)
  116.         self.process_queue()
  117.         logger.info("程序启动")
  118.     # ---------------------- 界面构建 ----------------------
  119.     def build_ui(self):
  120.         ttk.Label(self.root, text="老板键设置(可添加多条规则)", font=("微软雅黑", 12, "bold")).pack(pady=(10, 5))
  121.         # ---------- 可滚动的配置列表区域 ----------
  122.         container = ttk.Frame(self.root)
  123.         container.pack(fill="both", expand=True, padx=20, pady=4)
  124.         canvas = tk.Canvas(container, borderwidth=0, highlightthickness=0)
  125.         scrollbar = ttk.Scrollbar(container, orient="vertical", command=canvas.yview)
  126.         self.config_list_frame = ttk.Frame(canvas)
  127.         self.config_list_frame.bind("<Configure>",
  128.                                     lambda e: canvas.configure(scrollregion=canvas.bbox("all")))
  129.         canvas.create_window((0, 0), window=self.config_list_frame, anchor="nw")
  130.         canvas.configure(yscrollcommand=scrollbar.set)
  131.         canvas.pack(side="left", fill="both", expand=True)
  132.         scrollbar.pack(side="right", fill="y")
  133.         def _on_mousewheel(event):
  134.             canvas.yview_scroll(int(-1*(event.delta/120)), "units")
  135.         canvas.bind_all("<MouseWheel>", _on_mousewheel)
  136.         for item in self.config_items:
  137.             self._add_config_row(item)
  138.         if not self.config_items:
  139.             default_item = HideConfigItem(hide_type=HideConfigItem.HIDE_TOPMOST, hotkey="ctrl+shift+f10")
  140.             self.config_items.append(default_item)
  141.             self._add_config_row(default_item)
  142.         # ---------- 按钮区 ----------
  143.         bottom_frame = ttk.Frame(self.root)
  144.         bottom_frame.pack(pady=(8, 5), fill="x", padx=20)
  145.         btn_add = ttk.Button(bottom_frame, text="添加配置项", command=self.add_config_item)
  146.         btn_add.pack(side="left", padx=5)
  147.         self.start_btn = ttk.Button(bottom_frame, text="启动老板键", command=self.start)
  148.         self.start_btn.pack(side="left", padx=5)
  149.         self.stop_btn = ttk.Button(bottom_frame, text="停止老板键", command=self.stop, state="disabled")
  150.         self.stop_btn.pack(side="left", padx=5)
  151.         self.recover_all_btn = ttk.Button(bottom_frame, text="一键恢复所有隐藏窗口", command=self.recover_all_windows)
  152.         self.recover_all_btn.pack(side="left", padx=5)
  153.         self.status_label = ttk.Label(self.root, text="状态:未启动", foreground="gray")
  154.         self.status_label.pack(pady=(2, 10))
  155.     def _add_config_row(self, item):
  156.         frame = ttk.Frame(self.config_list_frame)
  157.         frame.pack(fill="x", pady=3, padx=2)
  158.         # 启用复选框
  159.         cb = ttk.Checkbutton(frame, variable=item.enable)
  160.         cb.pack(side="left", padx=(5, 2))
  161.         # ★ 类型下拉(显示中文)
  162.         type_combo = ttk.Combobox(frame, textvariable=item.type_display,
  163.                                   values=["隐藏自身", "隐藏最表层窗口", "隐藏指定窗口"],
  164.                                   state="readonly", width=14)
  165.         type_combo.pack(side="left", padx=2)
  166.         # 快捷键输入框
  167.         hotkey_entry = ttk.Entry(frame, textvariable=item.hotkey, width=18, font=("Consolas", 10))
  168.         hotkey_entry.pack(side="left", padx=2)
  169.         # 捕获按钮
  170.         btn_capture = ttk.Button(frame, text="捕获",
  171.                                  command=lambda it=item: self.capture_hotkey(it.hotkey))
  172.         btn_capture.pack(side="left", padx=2)
  173.         # 目标标题输入(仅当类型为 target 时显示)
  174.         title_entry = ttk.Entry(frame, textvariable=item.target_title, width=20)
  175.         title_label = ttk.Label(frame, text="标题:")
  176.         def update_title_visibility(*args):
  177.             if item.hide_type.get() == HideConfigItem.HIDE_TARGET:
  178.                 title_label.pack(side="left", padx=(10, 2))
  179.                 title_entry.pack(side="left", padx=2)
  180.             else:
  181.                 title_label.pack_forget()
  182.                 title_entry.pack_forget()
  183.         item.hide_type.trace("w", update_title_visibility)
  184.         update_title_visibility()
  185.         # 删除按钮
  186.         btn_del = ttk.Button(frame, text="删除",
  187.                              command=lambda f=frame, it=item: self.delete_config_item(f, it))
  188.         btn_del.pack(side="right", padx=5)
  189.         self.config_frames.append(frame)
  190.     def add_config_item(self):
  191.         new_item = HideConfigItem(hide_type=HideConfigItem.HIDE_TOPMOST, hotkey="")
  192.         self.config_items.append(new_item)
  193.         self._add_config_row(new_item)
  194.     def delete_config_item(self, frame, item):
  195.         if len(self.config_items) <= 1:
  196.             messagebox.showinfo("提示", "至少保留一个配置项")
  197.             return
  198.         if self.active:
  199.             messagebox.showwarning("提示", "请先停止老板键再删除配置")
  200.             return
  201.         self.config_items.remove(item)
  202.         frame.destroy()
  203.         self.config_frames.remove(frame)
  204.     # ---------------------- 一键恢复所有隐藏窗口 ----------------------
  205.     def recover_all_windows(self):
  206.         recovered = 0
  207.         if self.root.state() == "withdrawn":
  208.             self.root.deiconify()
  209.             self.root.lift()
  210.             self.root.focus_force()
  211.             recovered += 1
  212.             logger.info("一键恢复:自身窗口已显示")
  213.         for item in self.config_items:
  214.             if item.hide_type.get() == HideConfigItem.HIDE_SELF:
  215.                 if self.root.state() == "withdrawn":
  216.                     pass
  217.             else:
  218.                 for hwnd in item.hidden_hwnds:
  219.                     if win32gui.IsWindow(hwnd):
  220.                         win32gui.ShowWindow(hwnd, win32con.SW_SHOW)
  221.                         recovered += 1
  222.             item.hidden_hwnds.clear()
  223.             if item.hide_type.get() == HideConfigItem.HIDE_SELF:
  224.                 item.hidden_self = False
  225.         self.action_queue.put(("status", f"一键恢复完成,共恢复 {recovered} 个窗口"))
  226.     # ---------------------- 权限工具 ----------------------
  227.     @staticmethod
  228.     def is_admin():
  229.         try:
  230.             return ctypes.windll.shell32.IsUserAnAdmin()
  231.         except:
  232.             return False
  233.     @staticmethod
  234.     def run_as_admin():
  235.         try:
  236.             if getattr(sys, 'frozen', False):
  237.                 ctypes.windll.shell32.ShellExecuteW(None, "runas", sys.executable, '--elevated', None, 1)
  238.             else:
  239.                 script = sys.argv[0]
  240.                 params = f'"{script}" --elevated'
  241.                 ctypes.windll.shell32.ShellExecuteW(None, "runas", sys.executable, params, None, 1)
  242.         except Exception as e:
  243.             logger.error(f"请求管理员权限失败: {e}")
  244.     def auto_elevated_start(self):
  245.         logger.info("以管理员权限静默启动老板键")
  246.         self.start()
  247.         if self.active:
  248.             self.root.withdraw()
  249.             logger.info("窗口已隐藏,后台监听热键")
  250.     # ---------------------- 每个配置项的切换逻辑 ----------------------
  251.     def toggle_by_item(self, item):
  252.         t = item.hide_type.get()
  253.         if t == HideConfigItem.HIDE_SELF:
  254.             self._toggle_self(item)
  255.         elif t == HideConfigItem.HIDE_TOPMOST:
  256.             self._toggle_topmost(item)
  257.         elif t == HideConfigItem.HIDE_TARGET:
  258.             self._toggle_target(item)
  259.     def _toggle_self(self, item):
  260.         if self.root.state() == "withdrawn":
  261.             self.root.deiconify()
  262.             self.root.lift()
  263.             self.root.focus_force()
  264.             item.hidden_self = False
  265.             self.action_queue.put(("status", "自身窗口已显示"))
  266.             logger.info("自身窗口已显示")
  267.         else:
  268.             self.root.withdraw()
  269.             item.hidden_self = True
  270.             self.action_queue.put(("status", "自身窗口已隐藏"))
  271.             logger.info("自身窗口已隐藏")
  272.     def _toggle_topmost(self, item):
  273.         if item.hidden_hwnds and win32gui.IsWindow(item.hidden_hwnds[0]):
  274.             hwnd = item.hidden_hwnds[0]
  275.             win32gui.ShowWindow(hwnd, win32con.SW_SHOW)
  276.             title = win32gui.GetWindowText(hwnd)
  277.             item.hidden_hwnds.clear()
  278.             self.action_queue.put(("status", f"已恢复窗口:{title}"))
  279.             logger.info(f"恢复最表层窗口:{title}")
  280.         else:
  281.             hwnd = win32gui.GetForegroundWindow()
  282.             if hwnd:
  283.                 title = win32gui.GetWindowText(hwnd)
  284.                 if hwnd == self.root.winfo_id():
  285.                     self.action_queue.put(("status", "不能隐藏自身窗口,请使用自身隐藏规则"))
  286.                     return
  287.                 win32gui.ShowWindow(hwnd, win32con.SW_HIDE)
  288.                 item.hidden_hwnds = [hwnd]
  289.                 self.action_queue.put(("status", f"已隐藏窗口:{title}"))
  290.                 logger.info(f"隐藏最表层窗口:{title}")
  291.             else:
  292.                 self.action_queue.put(("status", "未找到前台窗口"))
  293.     def _toggle_target(self, item):
  294.         if item.hidden_hwnds:
  295.             restored = 0
  296.             for hwnd in item.hidden_hwnds:
  297.                 if win32gui.IsWindow(hwnd):
  298.                     win32gui.ShowWindow(hwnd, win32con.SW_SHOW)
  299.                     restored += 1
  300.             item.hidden_hwnds.clear()
  301.             self.action_queue.put(("status", f"已显示 {restored} 个窗口"))
  302.             logger.info(f"目标窗口已恢复,数量: {restored}")
  303.         else:
  304.             title = item.target_title.get().strip()
  305.             if not title:
  306.                 self.action_queue.put(("status", "请填写目标窗口标题关键字!"))
  307.                 logger.warning("目标隐藏:标题为空")
  308.                 return
  309.             matches = gw.getWindowsWithTitle(title)
  310.             if not matches:
  311.                 self.action_queue.put(("status", f"未找到包含 '{title}' 的窗口"))
  312.                 logger.info(f"未找到匹配窗口: {title}")
  313.                 return
  314.             hidden = 0
  315.             for win in matches:
  316.                 if win.visible:
  317.                     win.hide()
  318.                     item.hidden_hwnds.append(win._hWnd)
  319.                     hidden += 1
  320.             if hidden:
  321.                 self.action_queue.put(("status", f"已隐藏 {hidden} 个窗口"))
  322.                 logger.info(f"隐藏目标窗口: {title},数量: {hidden}")
  323.             else:
  324.                 self.action_queue.put(("status", "没有可见的匹配窗口需要隐藏"))
  325.                 logger.info(f"没有可见的匹配窗口: {title}")
  326.     # ---------------------- 热键注册(基于配置列表)---------------------
  327.     def _start_hotkeys(self):
  328.         try:
  329.             registered = set()
  330.             for item in self.config_items:
  331.                 if not item.enable.get():
  332.                     continue
  333.                 hk = item.hotkey.get().strip()
  334.                 if not hk:
  335.                     continue
  336.                 try:
  337.                     keyboard.remove_hotkey(hk)
  338.                 except:
  339.                     pass
  340.                 keyboard.add_hotkey(hk, lambda it=item: self.action_queue.put(("toggle_item", it)))
  341.                 registered.add(hk)
  342.                 logger.info(f"注册热键: {hk} (类型: {item.hide_type.get()})")
  343.             self.registered_hotkeys = registered
  344.             return True
  345.         except Exception as e:
  346.             logger.error(f"注册热键失败: {e}")
  347.             return False
  348.     def _stop_hotkeys(self):
  349.         for hk in self.registered_hotkeys:
  350.             try:
  351.                 keyboard.remove_hotkey(hk)
  352.             except:
  353.                 pass
  354.         self.registered_hotkeys.clear()
  355.         for item in self.config_items:
  356.             for hwnd in item.hidden_hwnds:
  357.                 if win32gui.IsWindow(hwnd):
  358.                     win32gui.ShowWindow(hwnd, win32con.SW_SHOW)
  359.             item.hidden_hwnds.clear()
  360.             if item.hide_type.get() == HideConfigItem.HIDE_SELF:
  361.                 item.hidden_self = False
  362.         if self.root.state() == "withdrawn":
  363.             self.root.deiconify()
  364.         self.active = False
  365.         self.start_btn.config(state="normal")
  366.         self.stop_btn.config(state="disabled")
  367.         self.status_label.config(text="状态:已停止")
  368.         logger.info("老板键已停止")
  369.     def start(self):
  370.         if self.active:
  371.             messagebox.showinfo("提示", "老板键已启动,无需重复操作")
  372.             return
  373.         valid = False
  374.         for item in self.config_items:
  375.             if item.enable.get() and item.hotkey.get().strip():
  376.                 valid = True
  377.                 break
  378.         if not valid:
  379.             messagebox.showwarning("提示", "请至少启用一个配置项并设置快捷键!")
  380.             return
  381.         if not self.is_admin():
  382.             if not messagebox.askyesno("权限提示",
  383.                                        "注册全局热键通常需要管理员权限,否则可能无效。\n是否继续尝试启动?"):
  384.                 return
  385.         if self._start_hotkeys():
  386.             self.active = True
  387.             self.start_btn.config(state="disabled")
  388.             self.stop_btn.config(state="normal")
  389.             self.status_label.config(text="状态:已启动(老板键生效)")
  390.             self.save_config()
  391.             logger.info("老板键已启动")
  392.         else:
  393.             if not self.is_admin():
  394.                 if messagebox.askyesno("需要管理员权限",
  395.                                        "注册全局热键失败。是否以管理员身份重新启动程序?"):
  396.                     self.save_config()
  397.                     self.run_as_admin()
  398.                     self.root.destroy()
  399.                     sys.exit(0)
  400.                 else:
  401.                     messagebox.showinfo("取消", "老板键未启动。")
  402.             else:
  403.                 messagebox.showerror("错误", "热键注册失败,请检查快捷键是否被占用。")
  404.     def stop(self):
  405.         self.action_queue.put(("stop",))
  406.         self.status_label.config(text="状态:已停止")
  407.     def on_closing(self):
  408.         if self.active:
  409.             self._stop_hotkeys()
  410.         logger.info("程序退出")
  411.         self.root.destroy()
  412.     # ---------------------- 快捷键捕获与队列 ----------------------
  413.     def capture_hotkey(self, var):
  414.         def _capture():
  415.             try:
  416.                 self.action_queue.put(("status", "请按下组合键..."))
  417.                 hotkey_str = keyboard.read_hotkey(suppress=False)
  418.                 self.action_queue.put(("update_hotkey", var, hotkey_str))
  419.                 logger.info(f"捕获快捷键: {hotkey_str}")
  420.             except Exception as e:
  421.                 self.action_queue.put(("status", f"捕获失败: {e}"))
  422.                 logger.error(f"捕获快捷键失败: {e}")
  423.         threading.Thread(target=_capture, daemon=True).start()
  424.     def process_queue(self):
  425.         try:
  426.             while True:
  427.                 cmd = self.action_queue.get_nowait()
  428.                 if cmd[0] == "status":
  429.                     self.status_label.config(text=cmd[1])
  430.                 elif cmd[0] == "update_hotkey":
  431.                     _, var, value = cmd
  432.                     var.set(value)
  433.                 elif cmd[0] == "toggle_item":
  434.                     item = cmd[1]
  435.                     self.toggle_by_item(item)
  436.                 elif cmd[0] == "stop":
  437.                     self._stop_hotkeys()
  438.         except queue.Empty:
  439.             pass
  440.         self.root.after(100, self.process_queue)
  441.     # ---------------------- 配置持久化 ----------------------
  442.     def save_config(self):
  443.         data = [item.to_dict() for item in self.config_items]
  444.         try:
  445.             with open(CONFIG_FILE, "w", encoding="utf-8") as f:
  446.                 json.dump(data, f, ensure_ascii=False, indent=2)
  447.             logger.debug("配置已保存")
  448.         except Exception as e:
  449.             logger.error(f"保存配置失败: {e}")
  450.     def load_config(self):
  451.         if os.path.exists(CONFIG_FILE):
  452.             try:
  453.                 with open(CONFIG_FILE, "r", encoding="utf-8") as f:
  454.                     data = json.load(f)
  455.                 if isinstance(data, list):
  456.                     for item_data in data:
  457.                         self.config_items.append(HideConfigItem.from_dict(item_data))
  458.                 else:
  459.                     # 兼容旧版单个配置
  460.                     logger.info("检测到旧版配置,正在转换...")
  461.                     old = data
  462.                     if old.get("enable_self"):
  463.                         self.config_items.append(HideConfigItem(
  464.                             enable=True, hide_type=HideConfigItem.HIDE_SELF,
  465.                             hotkey=old.get("self_hotkey", "ctrl+shift+f9")
  466.                         ))
  467.                     if old.get("enable_topmost"):
  468.                         self.config_items.append(HideConfigItem(
  469.                             enable=True, hide_type=HideConfigItem.HIDE_TOPMOST,
  470.                             hotkey=old.get("topmost_hotkey", "ctrl+shift+f11")
  471.                         ))
  472.                     if old.get("enable_target"):
  473.                         self.config_items.append(HideConfigItem(
  474.                             enable=True, hide_type=HideConfigItem.HIDE_TARGET,
  475.                             hotkey=old.get("target_hotkey", "ctrl+shift+f10"),
  476.                             target_title=old.get("target_title", "")
  477.                         ))
  478.                 logger.info("已加载历史配置")
  479.             except Exception as e:
  480.                 logger.error(f"加载配置失败: {e}")
  481. # ---------------------- 主入口 ----------------------
  482. if __name__ == "__main__":
  483.     auto_mode = "--elevated" in sys.argv
  484.     root = tk.Tk()
  485.     app = BossKeyApp(root, auto_start=auto_mode)
  486.     root.mainloop()
复制代码

下载地址

https://yanhe520.lanzoub.com/b0uma9hkj

密码:huuv

© 版权声明

相关文章