From 30d565ee003deb5b28e147c170782728905ab51a Mon Sep 17 00:00:00 2001 From: Ivan Hanloth Date: Sun, 20 Apr 2025 21:57:25 +0800 Subject: [PATCH 1/8] =?UTF-8?q?=E6=96=B0=E5=A2=9Elogo?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- logo.png | Bin 0 -> 79893 bytes 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 logo.png diff --git a/logo.png b/logo.png new file mode 100644 index 0000000000000000000000000000000000000000..27890c4ba2909c66d3978c1d90506316ff4e07d1 GIT binary patch literal 79893 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 literal 0 HcmV?d00001 From 15006834f42c2d7fc7b7687ea928c6c5fd200bc3 Mon Sep 17 00:00:00 2001 From: Ivan Hanloth Date: Sun, 20 Apr 2025 21:57:57 +0800 Subject: [PATCH 2/8] =?UTF-8?q?=E6=9B=B4=E6=96=B0gitignore?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .gitignore | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/.gitignore b/.gitignore index 315d011..4014716 100644 --- a/.gitignore +++ b/.gitignore @@ -5,4 +5,5 @@ config.json user.ini *.lock out/ -test.py \ No newline at end of file +test.py +pssuspend64.exe \ No newline at end of file From 71b91005ec6056b0616c54f7211d65f738b09bdb Mon Sep 17 00:00:00 2001 From: Ivan Hanloth Date: Sun, 20 Apr 2025 23:44:14 +0800 Subject: [PATCH 3/8] =?UTF-8?q?=E6=94=AF=E6=8C=81=E9=BC=A0=E6=A0=87?= =?UTF-8?q?=E9=9A=90=E8=97=8F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- main/GUI/setting/hotkeys_page.py | 39 ++++++++++++++++++++++++++++++-- main/core/config.py | 11 ++++++++- main/core/listener.py | 34 ++++++++++++++++++++++++++-- 3 files changed, 79 insertions(+), 5 deletions(-) diff --git a/main/GUI/setting/hotkeys_page.py b/main/GUI/setting/hotkeys_page.py index a7e2998..3e1326d 100644 --- a/main/GUI/setting/hotkeys_page.py +++ b/main/GUI/setting/hotkeys_page.py @@ -11,7 +11,10 @@ def __init__(self, parent): def init_UI(self): sizer = wx.BoxSizer(wx.VERTICAL) - # 创建网格布局 + # 创建键盘热键设置区域 + keyboard_box = wx.StaticBox(self, label="键盘热键") + keyboard_box_sizer = wx.StaticBoxSizer(keyboard_box, wx.VERTICAL) + grid_sizer = wx.FlexGridSizer(rows=2, cols=3, gap=(10, 20)) grid_sizer.AddGrowableCol(1, 1) @@ -33,7 +36,30 @@ def init_UI(self): grid_sizer.Add(self.close_text, 1, wx.EXPAND | wx.ALL, 10) grid_sizer.Add(self.close_btn, 0, wx.EXPAND | wx.ALL, 10) - sizer.Add(grid_sizer, 0, wx.EXPAND | wx.ALL, 10) + keyboard_box_sizer.Add(grid_sizer, 0, wx.EXPAND | wx.ALL, 5) + sizer.Add(keyboard_box_sizer, 0, wx.EXPAND | wx.ALL, 10) + + # 添加鼠标隐藏选项 + mouse_box = wx.StaticBox(self, label="鼠标隐藏") + mouse_box_sizer = wx.StaticBoxSizer(mouse_box, wx.VERTICAL) + + # 中键选项 + self.middle_button_checkbox = wx.CheckBox(self, label="启用鼠标中键隐藏窗口") + self.middle_button_checkbox.SetToolTip(wx.ToolTip("点击鼠标中键可快速隐藏/显示窗口")) + + # 侧键1选项 + self.side_button1_checkbox = wx.CheckBox(self, label="启用鼠标侧键1隐藏窗口") + self.side_button1_checkbox.SetToolTip(wx.ToolTip("点击鼠标侧键1(前进键)可快速隐藏/显示窗口")) + + # 侧键2选项 + self.side_button2_checkbox = wx.CheckBox(self, label="启用鼠标侧键2隐藏窗口") + self.side_button2_checkbox.SetToolTip(wx.ToolTip("点击鼠标侧键2(后退键)可快速隐藏/显示窗口")) + + mouse_box_sizer.Add(self.middle_button_checkbox, 0, wx.ALL, 10) + mouse_box_sizer.Add(self.side_button1_checkbox, 0, wx.ALL, 10) + mouse_box_sizer.Add(self.side_button2_checkbox, 0, wx.ALL, 10) + + sizer.Add(mouse_box_sizer, 0, wx.EXPAND | wx.ALL, 10) self.SetSizer(sizer) @@ -44,14 +70,23 @@ def Bind_EVT(self): def SetData(self): self.hide_show_text.SetValue(Config.hide_hotkey) self.close_text.SetValue(Config.close_hotkey) + self.middle_button_checkbox.SetValue(Config.middle_button_hide if hasattr(Config, 'middle_button_hide') else False) + self.side_button1_checkbox.SetValue(Config.side_button1_hide if hasattr(Config, 'side_button1_hide') else False) + self.side_button2_checkbox.SetValue(Config.side_button2_hide if hasattr(Config, 'side_button2_hide') else False) def SaveData(self): Config.hide_hotkey = self.hide_show_text.GetValue() Config.close_hotkey = self.close_text.GetValue() + Config.middle_button_hide = self.middle_button_checkbox.GetValue() + Config.side_button1_hide = self.side_button1_checkbox.GetValue() + Config.side_button2_hide = self.side_button2_checkbox.GetValue() def Reset(self): self.hide_show_text.SetValue("Ctrl+Q") self.close_text.SetValue("Win+Esc") + self.middle_button_checkbox.SetValue(False) + self.side_button1_checkbox.SetValue(False) + self.side_button2_checkbox.SetValue(False) def OnRecordHideShow(self, e): self.recordHotkey(self.hide_show_text, self.hide_show_btn) diff --git a/main/core/config.py b/main/core/config.py index dcf73ff..b805d1a 100644 --- a/main/core/config.py +++ b/main/core/config.py @@ -53,6 +53,9 @@ class Config: click_to_hide = True hide_icon_after_hide = False path_match = True + middle_button_hide = False # 新增:鼠标中键隐藏功能开关 + side_button1_hide = False # 鼠标侧键1隐藏功能开关 + side_button2_hide = False # 鼠标侧键2隐藏功能开关 hide_binding = [] @@ -97,6 +100,9 @@ def load(): Config.path_match = config.get("setting", {}).get("path_match", False) Config.freeze_after_hide = config.get("setting", {}).get("freeze_after_hide", False) # 加载新配置项 Config.enhanced_freeze = config.get("setting", {}).get("enhanced_freeze", False) # 加载新配置项 + Config.middle_button_hide = config.get("setting", {}).get("middle_button_hide", False) # 加载鼠标中键隐藏设置 + Config.side_button1_hide = config.get("setting", {}).get("side_button1_hide", False) # 加载鼠标侧键1隐藏设置 + Config.side_button2_hide = config.get("setting", {}).get("side_button2_hide", False) # 加载鼠标侧键2隐藏设置 Config.click_to_hide= config.get("setting", {}).get("click_to_hide", True) @@ -128,7 +134,10 @@ def save(): 'hide_icon_after_hide': Config.hide_icon_after_hide, 'path_match': Config.path_match, 'freeze_after_hide': Config.freeze_after_hide, # 保存新配置项 - 'enhanced_freeze': Config.enhanced_freeze # 保存新配置项 + 'enhanced_freeze': Config.enhanced_freeze, # 保存新配置项 + 'middle_button_hide': Config.middle_button_hide, # 保存鼠标中键隐藏设置 + 'side_button1_hide': Config.side_button1_hide, # 保存鼠标侧键1隐藏设置 + 'side_button2_hide': Config.side_button2_hide # 保存鼠标侧键2隐藏设置 }, # 将WindowInfo对象列表转换为字典列表用于JSON序列化 "hide_binding": [item.to_dict() if isinstance(item, WindowInfo) else item for item in Config.hide_binding] diff --git a/main/core/listener.py b/main/core/listener.py index 0358aa3..1e350d9 100644 --- a/main/core/listener.py +++ b/main/core/listener.py @@ -4,7 +4,7 @@ from win32con import SW_HIDE, SW_SHOW import win32process import sys -from pynput import keyboard +from pynput import keyboard, mouse # 确保导入mouse模块 import multiprocessing import threading import time @@ -20,6 +20,7 @@ def __init__(self): tool.sendNotify("Boss Key正在运行!", "Boss Key正在为您服务,您可通过托盘图标看到我") self.Queue = multiprocessing.Queue() self.listener = None + self.mouse_listener = None # 添加鼠标监听器变量 self.reBind() self.end_flag=False threading.Thread(target=self.listenToQueue,daemon=True).start() @@ -57,7 +58,28 @@ def listenToQueue(self): def reBind(self): self._stop() self.BindHotKey() - + # 如果启用了任何鼠标按键隐藏,则添加鼠标监听 + if (hasattr(Config, 'middle_button_hide') and Config.middle_button_hide) or \ + (hasattr(Config, 'side_button1_hide') and Config.side_button1_hide) or \ + (hasattr(Config, 'side_button2_hide') and Config.side_button2_hide): + self.start_mouse_listener() + + def start_mouse_listener(self): + """启动鼠标监听器""" + if self.mouse_listener is None or not self.mouse_listener.is_alive(): + self.mouse_listener = mouse.Listener(on_click=self.on_mouse_click) + self.mouse_listener.daemon = True + self.mouse_listener.start() + + def on_mouse_click(self, x, y, button, pressed): + """鼠标点击事件处理""" + if pressed: # 只在按下时触发,不在松开时触发 + if (button == mouse.Button.middle and Config.middle_button_hide) or \ + (button == mouse.Button.x1 and Config.side_button1_hide) or \ + (button == mouse.Button.x2 and Config.side_button2_hide): + # 在主线程中执行onHide + wx.CallAfter(self.onHide) + def ListenerProcess(self,hotkey): try: with keyboard.GlobalHotKeys(hotkey) as listener: @@ -201,3 +223,11 @@ def _stop(self): pass finally: self.listener = None + + # 停止鼠标监听器 + if hasattr(self, 'mouse_listener') and self.mouse_listener is not None: + try: + self.mouse_listener.stop() + self.mouse_listener = None + except: + pass From 51e19bc3b493d146b874d9774267d8364a09f9bc Mon Sep 17 00:00:00 2001 From: Ivan Hanloth Date: Mon, 21 Apr 2025 00:52:22 +0800 Subject: [PATCH 4/8] =?UTF-8?q?=E6=96=B0=E5=A2=9E=E8=87=AA=E5=8A=A8?= =?UTF-8?q?=E9=9A=90=E8=97=8F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- main/GUI/setting/hotkeys_page.py | 42 +++++++ main/core/config.py | 8 +- main/core/listener.py | 206 +++++++++++++++++++++++++------ 3 files changed, 218 insertions(+), 38 deletions(-) diff --git a/main/GUI/setting/hotkeys_page.py b/main/GUI/setting/hotkeys_page.py index 3e1326d..af39cfd 100644 --- a/main/GUI/setting/hotkeys_page.py +++ b/main/GUI/setting/hotkeys_page.py @@ -61,11 +61,38 @@ def init_UI(self): sizer.Add(mouse_box_sizer, 0, wx.EXPAND | wx.ALL, 10) + # 添加其他选项区域 + other_box = wx.StaticBox(self, label="其他") + other_box_sizer = wx.StaticBoxSizer(other_box, wx.VERTICAL) + + # 自动隐藏选项 + auto_hide_sizer = wx.BoxSizer(wx.HORIZONTAL) + self.auto_hide_checkbox = wx.CheckBox(self, label="自动隐藏:") + self.auto_hide_checkbox.SetToolTip(wx.ToolTip("在无操作指定时间后自动隐藏窗口")) + auto_hide_sizer.Add(self.auto_hide_checkbox, 0, wx.ALIGN_CENTER_VERTICAL) + + # 自动隐藏时间输入框 + self.auto_hide_time = wx.SpinCtrl(self, min=1, max=120, initial=5) + self.auto_hide_time.SetToolTip(wx.ToolTip("设置多少分钟无操作后自动隐藏")) + auto_hide_sizer.Add(self.auto_hide_time, 0, wx.LEFT, 10) + + # 分钟标签 + minutes_label = wx.StaticText(self, label="分钟") + auto_hide_sizer.Add(minutes_label, 0, wx.ALIGN_CENTER_VERTICAL | wx.LEFT, 5) + + other_box_sizer.Add(auto_hide_sizer, 0, wx.ALL, 10) + sizer.Add(other_box_sizer, 0, wx.EXPAND | wx.ALL, 10) + self.SetSizer(sizer) def Bind_EVT(self): self.hide_show_btn.Bind(wx.EVT_BUTTON, self.OnRecordHideShow) self.close_btn.Bind(wx.EVT_BUTTON, self.OnRecordClose) + self.auto_hide_checkbox.Bind(wx.EVT_CHECKBOX, self.OnAutoHideToggle) + + def OnAutoHideToggle(self, e): + # 启用或禁用时间输入框 + self.auto_hide_time.Enable(self.auto_hide_checkbox.GetValue()) def SetData(self): self.hide_show_text.SetValue(Config.hide_hotkey) @@ -74,6 +101,14 @@ def SetData(self): self.side_button1_checkbox.SetValue(Config.side_button1_hide if hasattr(Config, 'side_button1_hide') else False) self.side_button2_checkbox.SetValue(Config.side_button2_hide if hasattr(Config, 'side_button2_hide') else False) + # 设置自动隐藏选项 + auto_hide_enabled = Config.auto_hide_enabled if hasattr(Config, 'auto_hide_enabled') else False + self.auto_hide_checkbox.SetValue(auto_hide_enabled) + + auto_hide_time = Config.auto_hide_time if hasattr(Config, 'auto_hide_time') else 5 + self.auto_hide_time.SetValue(auto_hide_time) + self.auto_hide_time.Enable(auto_hide_enabled) + def SaveData(self): Config.hide_hotkey = self.hide_show_text.GetValue() Config.close_hotkey = self.close_text.GetValue() @@ -81,12 +116,19 @@ def SaveData(self): Config.side_button1_hide = self.side_button1_checkbox.GetValue() Config.side_button2_hide = self.side_button2_checkbox.GetValue() + # 保存自动隐藏设置 + Config.auto_hide_enabled = self.auto_hide_checkbox.GetValue() + Config.auto_hide_time = self.auto_hide_time.GetValue() + def Reset(self): self.hide_show_text.SetValue("Ctrl+Q") self.close_text.SetValue("Win+Esc") self.middle_button_checkbox.SetValue(False) self.side_button1_checkbox.SetValue(False) self.side_button2_checkbox.SetValue(False) + self.auto_hide_checkbox.SetValue(False) + self.auto_hide_time.SetValue(5) + self.auto_hide_time.Enable(False) def OnRecordHideShow(self, e): self.recordHotkey(self.hide_show_text, self.hide_show_btn) diff --git a/main/core/config.py b/main/core/config.py index b805d1a..418c851 100644 --- a/main/core/config.py +++ b/main/core/config.py @@ -56,6 +56,8 @@ class Config: middle_button_hide = False # 新增:鼠标中键隐藏功能开关 side_button1_hide = False # 鼠标侧键1隐藏功能开关 side_button2_hide = False # 鼠标侧键2隐藏功能开关 + auto_hide_enabled = False # 自动隐藏功能开关 + auto_hide_time = 5 # 自动隐藏等待时间(分钟) hide_binding = [] @@ -103,6 +105,8 @@ def load(): Config.middle_button_hide = config.get("setting", {}).get("middle_button_hide", False) # 加载鼠标中键隐藏设置 Config.side_button1_hide = config.get("setting", {}).get("side_button1_hide", False) # 加载鼠标侧键1隐藏设置 Config.side_button2_hide = config.get("setting", {}).get("side_button2_hide", False) # 加载鼠标侧键2隐藏设置 + Config.auto_hide_enabled = config.get("setting", {}).get("auto_hide_enabled", False) # 加载自动隐藏功能开关 + Config.auto_hide_time = config.get("setting", {}).get("auto_hide_time", 5) # 加载自动隐藏等待时间 Config.click_to_hide= config.get("setting", {}).get("click_to_hide", True) @@ -137,7 +141,9 @@ def save(): 'enhanced_freeze': Config.enhanced_freeze, # 保存新配置项 'middle_button_hide': Config.middle_button_hide, # 保存鼠标中键隐藏设置 'side_button1_hide': Config.side_button1_hide, # 保存鼠标侧键1隐藏设置 - 'side_button2_hide': Config.side_button2_hide # 保存鼠标侧键2隐藏设置 + 'side_button2_hide': Config.side_button2_hide, # 保存鼠标侧键2隐藏设置 + 'auto_hide_enabled': Config.auto_hide_enabled, # 保存自动隐藏功能开关 + 'auto_hide_time': Config.auto_hide_time # 保存自动隐藏等待时间 }, # 将WindowInfo对象列表转换为字典列表用于JSON序列化 "hide_binding": [item.to_dict() if isinstance(item, WindowInfo) else item for item in Config.hide_binding] diff --git a/main/core/listener.py b/main/core/listener.py index 1e350d9..f7f58cb 100644 --- a/main/core/listener.py +++ b/main/core/listener.py @@ -13,17 +13,29 @@ class HotkeyListener(): def __init__(self): + # 先定义所有属性 + self.Queue = multiprocessing.Queue() + self.listener = None + self.mouse_listener = None + self.keyboard_activity_listener = None + self.mouse_activity_listener = None + self.last_activity_time = time.time() + self.auto_hide_timer = None + self.shared_state_file = os.path.join(Config.root_path, ".bosskey_state") + self.end_flag = False + + # 然后再执行可能使用这些属性的方法 try: self.ShowWindows() except: pass tool.sendNotify("Boss Key正在运行!", "Boss Key正在为您服务,您可通过托盘图标看到我") - self.Queue = multiprocessing.Queue() - self.listener = None - self.mouse_listener = None # 添加鼠标监听器变量 + self.reBind() - self.end_flag=False - threading.Thread(target=self.listenToQueue,daemon=True).start() + threading.Thread(target=self.listenToQueue, daemon=True).start() + + # 启动自动隐藏监控(如果启用) + self.start_auto_hide_monitor() def listenToQueue(self): exit_flag = False @@ -41,9 +53,6 @@ def listenToQueue(self): self._stop() try: wx.GetApp().ExitMainLoop() - # wx.FindWindowById(Config.SettingWindowId).Destroy() - # wx.FindWindowById(Config.UpdateWindowId).Destroy() - # Config.TaskBarIcon.Destroy() except Exception as e: print(e) pass @@ -63,6 +72,89 @@ def reBind(self): (hasattr(Config, 'side_button1_hide') and Config.side_button1_hide) or \ (hasattr(Config, 'side_button2_hide') and Config.side_button2_hide): self.start_mouse_listener() + + # 启动自动隐藏监控(如果启用) + self.start_auto_hide_monitor() + + def start_auto_hide_monitor(self): + """启动自动隐藏监控""" + # 停止之前的监控 + self.stop_auto_hide_monitor() + + # 检查是否启用了自动隐藏 + if hasattr(Config, 'auto_hide_enabled') and Config.auto_hide_enabled: + # 启动活动监听器 + self.start_activity_listeners() + + # 启动定时器,每5秒检查一次是否需要自动隐藏 + self.auto_hide_timer = threading.Timer(5, self.check_auto_hide) + self.auto_hide_timer.daemon = True + self.auto_hide_timer.start() + + def stop_auto_hide_monitor(self): + """停止自动隐藏监控""" + # 停止定时器 + if self.auto_hide_timer: + self.auto_hide_timer.cancel() + self.auto_hide_timer = None + + # 停止活动监听器 + self.stop_activity_listeners() + + def start_activity_listeners(self): + """启动键盘和鼠标活动监听器""" + # 停止之前的监听器 + self.stop_activity_listeners() + + # 启动键盘活动监听器 + self.keyboard_activity_listener = keyboard.Listener(on_press=self.on_activity) + self.keyboard_activity_listener.daemon = True + self.keyboard_activity_listener.start() + + # 启动鼠标活动监听器 + self.mouse_activity_listener = mouse.Listener( + on_move=self.on_activity, + on_click=self.on_activity, + on_scroll=self.on_activity + ) + self.mouse_activity_listener.daemon = True + self.mouse_activity_listener.start() + + def stop_activity_listeners(self): + """停止键盘和鼠标活动监听器""" + if self.keyboard_activity_listener: + self.keyboard_activity_listener.stop() + self.keyboard_activity_listener = None + + if self.mouse_activity_listener: + self.mouse_activity_listener.stop() + self.mouse_activity_listener = None + + def on_activity(self, *args, **kwargs): + """记录最后一次活动时间""" + self.last_activity_time = time.time() + + def check_auto_hide(self): + """检查是否需要自动隐藏""" + try: + # 重新加载配置 + if hasattr(Config, 'auto_hide_enabled') and Config.auto_hide_enabled: + # 计算闲置时间(秒) + idle_time = time.time() - self.last_activity_time + # 转换自动隐藏时间为秒 + auto_hide_seconds = Config.auto_hide_time * 60 + + # 如果闲置时间超过设定的自动隐藏时间,且窗口当前是显示状态 + if idle_time >= auto_hide_seconds and self.get_windows_state() == 1: + # 执行隐藏操作,修复了这里的错误调用 + wx.CallAfter(self.onHide) + + finally: + # 如果仍然启用了自动隐藏,则设置下一次检查 + if hasattr(Config, 'auto_hide_enabled') and Config.auto_hide_enabled: + self.auto_hide_timer = threading.Timer(5, self.check_auto_hide) + self.auto_hide_timer.daemon = True + self.auto_hide_timer.start() def start_mouse_listener(self): """启动鼠标监听器""" @@ -80,7 +172,8 @@ def on_mouse_click(self, x, y, button, pressed): # 在主线程中执行onHide wx.CallAfter(self.onHide) - def ListenerProcess(self,hotkey): + def ListenerProcess(self, hotkey): + """键盘热键监听进程""" try: with keyboard.GlobalHotKeys(hotkey) as listener: self.end_flag = False @@ -93,7 +186,8 @@ def ListenerProcess(self,hotkey): print("热键监听已停止") except Exception as e: - self.ShowWindows(False) + # 热键监听出错时尝试恢复窗口 + self.set_windows_state(1) # 强制设置状态为显示 print(f"热键监听出错: {e}") def BindHotKey(self): @@ -103,18 +197,42 @@ def BindHotKey(self): } hotkeys = tool.keyConvert(hotkeys) - self.listener = multiprocessing.Process(target=self.ListenerProcess,daemon=True,args=(hotkeys,),name="Boss-Key热键监听进程") + self.listener = multiprocessing.Process(target=self.ListenerProcess, daemon=True, args=(hotkeys,), name="Boss-Key热键监听进程") self.listener.start() - def onHide(self,e=""): - if Config.times == 1: + def get_windows_state(self): + """获取窗口状态,1=显示,0=隐藏""" + try: + if os.path.exists(self.shared_state_file): + with open(self.shared_state_file, 'r') as f: + return int(f.read().strip() or '1') + return 1 # 默认状态为显示 + except: + return 1 # 出错时默认状态为显示 + + def set_windows_state(self, state): + """设置窗口状态,1=显示,0=隐藏""" + try: + with open(self.shared_state_file, 'w') as f: + f.write(str(state)) + Config.times = state # 同时更新内存中的状态 + except Exception as e: + print(f"设置窗口状态失败: {e}") + + def onHide(self, e=""): + """根据当前状态切换窗口显示/隐藏""" + # 从共享状态文件获取当前状态 + current_state = self.get_windows_state() + + if current_state == 1: # 隐藏窗口 self.HideWindows() else: + # 显示窗口 self.ShowWindows() - def ShowWindows(self,load=True): - # 显示窗口 + def ShowWindows(self, load=True): + """显示之前隐藏的窗口""" if load: Config.load() @@ -130,34 +248,34 @@ def ShowWindows(self,load=True): for i in Config.history: ShowWindow(i, SW_SHOW) if Config.mute_after_hide: - tool.changeMute(i,0) + tool.changeMute(i, 0) if Config.hide_icon_after_hide: self.Queue.put("showTaskBarIcon") - Config.times = 1 + # 更新状态 + self.set_windows_state(1) Config.save() def HideWindows(self): - # 隐藏窗口 - + """隐藏指定的窗口""" Config.load() - needHide=[] - frozen_pids=[] - windows=tool.getAllWindows() + needHide = [] + frozen_pids = [] + windows = tool.getAllWindows() - outer=windows - inner=Config.hide_binding + outer = windows + inner = Config.hide_binding - #减少循环次数,选择相对较少的做外循环 + # 减少循环次数,选择相对较少的做外循环 if len(Config.hide_binding) < len(windows): - outer=Config.hide_binding - inner=windows + outer = Config.hide_binding + inner = windows for i in outer: for j in inner: if tool.isSameWindow(i, j, False, not Config.path_match): - if outer==Config.hide_binding: # 此时i是绑定的元素,j是窗口元素,需要隐藏j + if outer == Config.hide_binding: # 此时i是绑定的元素,j是窗口元素,需要隐藏j needHide.append(j.hwnd) if Config.freeze_after_hide and hasattr(j, 'PID') and j.PID: frozen_pids.append(j.PID) @@ -167,7 +285,7 @@ def HideWindows(self): frozen_pids.append(i.PID) break - if Config.hide_current: # 插入当前窗口的句柄 + if Config.hide_current: # 插入当前窗口的句柄 hwnd = GetForegroundWindow() needHide.append(hwnd) # 如果需要冻结进程,获取当前窗口的PID @@ -175,13 +293,13 @@ def HideWindows(self): try: pid = win32process.GetWindowThreadProcessId(hwnd)[1] current_pid = win32process.GetCurrentProcessId() # 获取当前程序的PID - if pid != current_pid and pid !=os.getpid(): # 如果当前窗口的pid与本程序的pid相同,则不冻结 + if pid != current_pid and pid != os.getpid(): # 如果当前窗口的pid与本程序的pid相同,则不冻结 frozen_pids.append(pid) except: pass - needHide=tool.remove_duplicates(needHide) # 去重 - frozen_pids=tool.remove_duplicates(frozen_pids) if Config.freeze_after_hide else [] # 去重 + needHide = tool.remove_duplicates(needHide) # 去重 + frozen_pids = tool.remove_duplicates(frozen_pids) if Config.freeze_after_hide else [] # 去重 for i in needHide: if Config.send_before_hide: @@ -190,7 +308,7 @@ def HideWindows(self): ShowWindow(i, SW_HIDE) if Config.mute_after_hide: - tool.changeMute(i,1) + tool.changeMute(i, 1) # 冻结进程 if Config.freeze_after_hide and frozen_pids: @@ -201,13 +319,14 @@ def HideWindows(self): print(f"冻结进程失败: {e}") Config.frozen_pids = frozen_pids - Config.history=needHide - Config.times = 0 + Config.history = needHide + # 更新状态 + self.set_windows_state(0) if Config.hide_icon_after_hide: self.Queue.put("hideTaskBarIcon") Config.save() - def Close(self,e=""): + def Close(self, e=""): self.Queue.put("closeApp") def _stop(self): @@ -215,7 +334,7 @@ def _stop(self): 直接关闭listener,应该使用Close """ if self.listener is not None: - self.end_flag=True + self.end_flag = True try: self.listener.terminate() self.listener.join() @@ -231,3 +350,16 @@ def _stop(self): self.mouse_listener = None except: pass + + # 停止自动隐藏监控 + self.stop_auto_hide_monitor() + self._cleanup() + + def _cleanup(self): + # 清理状态文件 + try: + if hasattr(self, 'shared_state_file') and os.path.exists(self.shared_state_file): + os.remove(self.shared_state_file) + print("已清理状态文件") + except Exception as e: + print(f"清理状态文件失败: {e}") From 2f5135738e04ee4b9d4b029cce9897079d05ea22 Mon Sep 17 00:00:00 2001 From: Ivan Hanloth Date: Mon, 21 Apr 2025 00:53:17 +0800 Subject: [PATCH 5/8] =?UTF-8?q?=E4=BF=AE=E5=A4=8D=E7=AA=97=E5=8F=A3?= =?UTF-8?q?=E6=81=A2=E5=A4=8D=E5=B7=A5=E5=85=B7?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- main/GUI/window_restore.py | 27 ++++++++++++++++++++++----- 1 file changed, 22 insertions(+), 5 deletions(-) diff --git a/main/GUI/window_restore.py b/main/GUI/window_restore.py index b7c4008..16c9dad 100644 --- a/main/GUI/window_restore.py +++ b/main/GUI/window_restore.py @@ -2,7 +2,9 @@ import wx.dataview as dataview import win32gui import win32con +import win32process import webbrowser +import psutil from core import tools as tool from core.model import WindowInfo from core.config import Config @@ -84,11 +86,26 @@ def SetData(self): self.Layout() def RefreshLeftList(self, e=None): - windows = tool.getAllWindows() - list = [] - for window in windows: - list.append(window) - self.InsertTreeList(list, self.left_treelist, True) + def enumHandler(hwnd, windows): + title = tool.hwnd2windowName(hwnd) + + pid = win32process.GetWindowThreadProcessId(hwnd)[1] + process_name = psutil.Process(pid).name() + process_path = psutil.Process(pid).exe() + + windows.append(WindowInfo( + title=title, + hwnd=int(hwnd), + process=process_name, + PID=int(pid), + path=process_path + )) + return True + + windows = [] + win32gui.EnumWindows(enumHandler, windows) + windows.sort(key=lambda x: x.title) + self.InsertTreeList(windows, self.left_treelist, True) def on_refresh_window(self, e=None): """刷新窗口列表""" From 41912fec08b1603b1a2af3b04f7244ab766d41a4 Mon Sep 17 00:00:00 2001 From: Ivan Hanloth Date: Mon, 21 Apr 2025 00:53:28 +0800 Subject: [PATCH 6/8] =?UTF-8?q?=E4=BC=98=E5=8C=96=E7=A8=8B=E5=BA=8F?= =?UTF-8?q?=E5=85=B3=E9=97=AD=E6=B8=85=E7=90=86=E5=87=BD=E6=95=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- main/Boss-Key.py | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/main/Boss-Key.py b/main/Boss-Key.py index 068ea54..7a5e3e0 100644 --- a/main/Boss-Key.py +++ b/main/Boss-Key.py @@ -31,10 +31,19 @@ class APP(wx.App): def __init__(self): wx.App.__init__(self) def clean(): + print("Global Cleaning up...") + try: + Config.HotkeyListener._cleanup() + except: + pass try: Config.HotkeyListener.Close() except: pass + try: + os.remove(os.path.join(Config.root_path,"Boss-Key.lock")) + except: + pass atexit.register(clean) # 设置语言环境为中文 From 4a87781c48d98df1d6d56f251c9cf65fe6793d7f Mon Sep 17 00:00:00 2001 From: Ivan Hanloth Date: Mon, 21 Apr 2025 00:59:22 +0800 Subject: [PATCH 7/8] =?UTF-8?q?=E4=BC=98=E5=8C=96ui?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- main/GUI/setting/base.py | 4 ++-- main/GUI/setting/options_page.py | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/main/GUI/setting/base.py b/main/GUI/setting/base.py index 6a630a4..c76fbab 100644 --- a/main/GUI/setting/base.py +++ b/main/GUI/setting/base.py @@ -36,8 +36,8 @@ def init_UI(self): # 创建按钮 button_sizer = wx.BoxSizer(wx.HORIZONTAL) - self.reset_btn = wx.Button(panel, label="重置设置") - self.save_btn = wx.Button(panel, label="保存设置") + self.reset_btn = wx.Button(panel, label="重置设置", size=(-1, 50)) + self.save_btn = wx.Button(panel, label="保存设置", size=(-1, 50)) button_sizer.Add(self.reset_btn, proportion=1, flag=wx.LEFT, border=20) button_sizer.Add(self.save_btn, proportion=1, flag=wx.RIGHT, border=20) diff --git a/main/GUI/setting/options_page.py b/main/GUI/setting/options_page.py index 72ce557..a0fc3d4 100644 --- a/main/GUI/setting/options_page.py +++ b/main/GUI/setting/options_page.py @@ -226,7 +226,7 @@ def OnRequestAdmin(self, e=None): """请求管理员权限并重启程序""" wx.MessageBox("程序将重启并请求管理员权限", "提示", wx.OK | wx.ICON_INFORMATION) run_as_admin() - wx.GetApp().GetTopWindow().Close() + wx.GetApp().ExitMainLoop() def OnRedetectPssuspend(self, e=None): """重新检测pssuspend64.exe是否存在""" From 9013f5d6e03e1c7ab06a37b9ecf54decbb40492e Mon Sep 17 00:00:00 2001 From: Ivan Hanloth Date: Mon, 21 Apr 2025 01:08:35 +0800 Subject: [PATCH 8/8] =?UTF-8?q?=E6=96=B0=E5=A2=9E=E8=87=AA=E5=8A=A8?= =?UTF-8?q?=E9=9A=90=E8=97=8F=E7=9B=B8=E5=85=B3=E6=8F=90=E7=A4=BA?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- main/GUI/setting/hotkeys_page.py | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/main/GUI/setting/hotkeys_page.py b/main/GUI/setting/hotkeys_page.py index af39cfd..b37c58b 100644 --- a/main/GUI/setting/hotkeys_page.py +++ b/main/GUI/setting/hotkeys_page.py @@ -81,6 +81,12 @@ def init_UI(self): auto_hide_sizer.Add(minutes_label, 0, wx.ALIGN_CENTER_VERTICAL | wx.LEFT, 5) other_box_sizer.Add(auto_hide_sizer, 0, wx.ALL, 10) + + # 灰色文本提示 + auto_hide_tip = wx.StaticText(self, label="当键盘和鼠标在指定时间内无操作时,将自动隐藏窗口") + auto_hide_tip.SetForegroundColour(wx.Colour(128, 128, 128)) # 灰色文本 + other_box_sizer.Add(auto_hide_tip, 0, wx.ALL, 10) + sizer.Add(other_box_sizer, 0, wx.EXPAND | wx.ALL, 10) self.SetSizer(sizer)