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

2026-6-19 / 0 评论 / 3 阅读

先声明:代码由本人编写,但是由于本人代码编写不太规范,为了方便理解,所以让AI添加注释并且修改函数名

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


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

扫描二维码,在手机上阅读

评论一下?

OωO
取消