From 6841c00ec2ffbce026de51952db1b8b437e0283e Mon Sep 17 00:00:00 2001 From: Ivan Hanloth Date: Sun, 20 Apr 2025 18:34:09 +0800 Subject: [PATCH 01/18] =?UTF-8?q?=E9=87=8D=E6=9E=84=E7=95=8C=E9=9D=A2UI?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- main/Boss-Key.py | 3 +- main/GUI/setting.py | 459 ------------------------------- main/GUI/setting/__init__.py | 0 main/GUI/setting/base.py | 92 +++++++ main/GUI/setting/binding_page.py | 220 +++++++++++++++ main/GUI/setting/hotkeys_page.py | 79 ++++++ main/GUI/setting/options_page.py | 86 ++++++ main/GUI/window_restore.py | 75 +++-- 8 files changed, 525 insertions(+), 489 deletions(-) create mode 100644 main/GUI/setting/__init__.py create mode 100644 main/GUI/setting/base.py create mode 100644 main/GUI/setting/binding_page.py create mode 100644 main/GUI/setting/hotkeys_page.py create mode 100644 main/GUI/setting/options_page.py diff --git a/main/Boss-Key.py b/main/Boss-Key.py index 6b3b122..1aefa9c 100644 --- a/main/Boss-Key.py +++ b/main/Boss-Key.py @@ -19,6 +19,7 @@ from core.config import Config import platform import atexit +from GUI.setting.base import SettingWindow if platform.system() == "Windows": if platform.release() == "7": @@ -90,7 +91,7 @@ def is_already_running(self, name): Config.SettingWindowId = wx.NewIdRef() Config.TaskBarIcon=taskbar.TaskBarIcon() Config.HotkeyListener=listener.HotkeyListener() - setting.SettingWindow(Config.SettingWindowId) + SettingWindow(Config.SettingWindowId) if Config.first_start: wx.FindWindowById(Config.SettingWindowId).Show() app.MainLoop() diff --git a/main/GUI/setting.py b/main/GUI/setting.py index 25e9d1a..e69de29 100644 --- a/main/GUI/setting.py +++ b/main/GUI/setting.py @@ -1,459 +0,0 @@ -import wx -import wx.dataview as dataview -from core.config import Config -import GUI.record as record -import core.tools as tool -import wx.lib.buttons as buttons -from core.model import WindowInfo - -class SettingWindow(wx.Frame): - # 定义组件ID常量 - ID_LEFT_TREELIST = wx.NewIdRef() - ID_RIGHT_TREELIST = wx.NewIdRef() - ID_ADD_BINDING_BTN = wx.NewIdRef() - ID_REMOVE_BINDING_BTN = wx.NewIdRef() - ID_REFRESH_BTN = wx.NewIdRef() - ID_HIDE_SHOW_HOTKEY_TEXT = wx.NewIdRef() - ID_HIDE_SHOW_HOTKEY_BTN = wx.NewIdRef() - ID_CLOSE_HOTKEY_TEXT = wx.NewIdRef() - ID_CLOSE_HOTKEY_BTN = wx.NewIdRef() - ID_MUTE_AFTER_HIDE_CHECKBOX = wx.NewIdRef() - ID_SEND_BEFORE_HIDE_CHECKBOX = wx.NewIdRef() - ID_HIDE_CURRENT_CHECKBOX = wx.NewIdRef() - ID_CLICK_TO_HIDE_CHECKBOX = wx.NewIdRef() - ID_HIDE_ICON_AFTER_HIDE_CHECKBOX = wx.NewIdRef() - ID_PATH_MATCH_CHECKBOX = wx.NewIdRef() - ID_RESET_BTN = wx.NewIdRef() - ID_SAVE_BTN = wx.NewIdRef() - - def __init__(self,id=None): - super().__init__(None,id=id, title="设置 - Boss Key", style=wx.DEFAULT_FRAME_STYLE | wx.RESIZE_BORDER) - self.SetIcon(wx.Icon(wx.Image(Config.icon).ConvertToBitmap())) - - self.init_UI() - - self.Bind_EVT() - self.SetData() - self.SetSize((1500, 800)) - - self.Center() - - def init_UI(self): - panel = wx.Panel(self) - - # 主 sizer - main_sizer = wx.BoxSizer(wx.VERTICAL) - - # 上方sizer - top_sizer = wx.BoxSizer(wx.HORIZONTAL) - - # 左边列表 - left_staticbox = wx.StaticBox(panel, label="现有窗口进程") - left_sizer = wx.StaticBoxSizer(left_staticbox, wx.VERTICAL) - self.left_treelist = dataview.TreeListCtrl(panel, self.ID_LEFT_TREELIST, style=dataview.TL_CHECKBOX) - self.left_treelist.AppendColumn('窗口标题', width=300) - self.left_treelist.AppendColumn('窗口句柄', width=100) - self.left_treelist.AppendColumn('进程PID', width=150) - left_sizer.Add(self.left_treelist, 1, wx.EXPAND | wx.ALL, 5) - - - # 中键按钮 - middle_sizer = wx.BoxSizer(wx.VERTICAL) - add_binding_btn = buttons.GenButton(panel, self.ID_ADD_BINDING_BTN, label="添加绑定-->") - remove_binding_btn = buttons.GenButton(panel, self.ID_REMOVE_BINDING_BTN, label="<--删除绑定") - refresh_btn = buttons.GenButton(panel, self.ID_REFRESH_BTN, label="刷新进程") - middle_sizer.Add(add_binding_btn, 0, wx.EXPAND | wx.ALL, 5) - middle_sizer.Add(remove_binding_btn, 0, wx.EXPAND | wx.ALL, 5) - middle_sizer.Add(refresh_btn, 0, wx.EXPAND | wx.ALL, 5) - - # 右边列表 - right_staticbox = wx.StaticBox(panel, label="已绑定进程") - right_sizer = wx.StaticBoxSizer(right_staticbox, wx.VERTICAL) - self.right_treelist = dataview.TreeListCtrl(panel, self.ID_RIGHT_TREELIST, style=dataview.TL_CHECKBOX) - self.right_treelist.AppendColumn('窗口标题', width=300) - self.right_treelist.AppendColumn('窗口句柄', width=100) - self.right_treelist.AppendColumn('进程PID', width=150) - right_sizer.Add(self.right_treelist, 1, wx.EXPAND | wx.ALL, 5) - - # 加到上方的sizer中 - top_sizer.Add(left_sizer, 1, wx.EXPAND | wx.ALL, 5) - top_sizer.Add(middle_sizer, 0, wx.EXPAND | wx.ALL, 5) - top_sizer.Add(right_sizer, 1, wx.EXPAND | wx.ALL, 5) - - # 下方设置 - bottom_staticbox = wx.StaticBox(panel, label="其他设置") - bottom_sizer = wx.StaticBoxSizer(bottom_staticbox, wx.VERTICAL) - - hotkey_sizer=wx.GridSizer(rows=0, cols=2, gap=(10, 10)) - - #设置隐显窗口热键 - hide_show_hotkey_sizer = wx.BoxSizer(wx.HORIZONTAL) - hide_show_hotkey_label = wx.StaticText(panel, label="隐藏/显示窗口热键:") - hide_show_hotkey_text = wx.TextCtrl(panel, self.ID_HIDE_SHOW_HOTKEY_TEXT, value=Config.hide_hotkey) - hide_show_hotkey_btn = wx.Button(panel, self.ID_HIDE_SHOW_HOTKEY_BTN, label="录制热键") - hide_show_hotkey_sizer.Add(hide_show_hotkey_label, proportion=1, flag=wx.EXPAND| wx.ALL, border=10) - hide_show_hotkey_sizer.Add(hide_show_hotkey_text, proportion=1, flag=wx.EXPAND| wx.ALL, border=10) - hide_show_hotkey_sizer.Add(hide_show_hotkey_btn, proportion=1, flag=wx.EXPAND|wx.ALL, border=10) - hotkey_sizer.Add(hide_show_hotkey_sizer, proportion=1, flag=wx.EXPAND|wx.ALL, border=10) - - #设置关闭热键 - close_hotkey_sizer = wx.BoxSizer(wx.HORIZONTAL) - close_hotkey_label = wx.StaticText(panel, label="一键关闭程序热键:") - close_hotkey_text = wx.TextCtrl(panel, self.ID_CLOSE_HOTKEY_TEXT, value=Config.close_hotkey) - close_hotkey_btn = wx.Button(panel, self.ID_CLOSE_HOTKEY_BTN, label="录制热键") - close_hotkey_sizer.Add(close_hotkey_label, proportion=1, flag=wx.EXPAND| wx.ALL, border=10) - close_hotkey_sizer.Add(close_hotkey_text, proportion=1, flag=wx.EXPAND| wx.ALL, border=10) - close_hotkey_sizer.Add(close_hotkey_btn, proportion=1, flag=wx.EXPAND| wx.ALL, border=10) - hotkey_sizer.Add(close_hotkey_sizer, proportion=1, flag=wx.EXPAND| wx.ALL, border=10) - - bottom_sizer.Add(hotkey_sizer, flag=wx.EXPAND| wx.ALL) - - # 创建复选框 - settings_checkbox_sizer = wx.GridSizer(rows=0, cols=3, gap=(10, 10)) - - mute_after_hide_sizer=wx.BoxSizer(wx.HORIZONTAL) - mute_after_hide_label = wx.StaticText(panel, label="隐藏窗口后静音") - mute_after_hide_checkbox = wx.CheckBox(panel, self.ID_MUTE_AFTER_HIDE_CHECKBOX, "") - mute_after_hide_sizer.Add(mute_after_hide_label,proportion=1, flag=wx.EXPAND| wx.ALL) - mute_after_hide_sizer.Add(mute_after_hide_checkbox,proportion=1, flag=wx.EXPAND| wx.ALL) - settings_checkbox_sizer.Add(mute_after_hide_sizer,proportion=1,flag=wx.EXPAND| wx.ALL, border=10) - - send_before_hide_sizer=wx.BoxSizer(wx.HORIZONTAL) - send_before_hide_label = wx.StaticText(panel, label="隐藏前发送暂停键(Beta)") - send_before_hide_label.SetToolTip(wx.ToolTip("隐藏窗口前发送暂停键,用于关闭弹出的输入框等,隐藏窗口会存在一定的延迟")) - send_before_hide_checkbox = wx.CheckBox(panel, self.ID_SEND_BEFORE_HIDE_CHECKBOX, "") - send_before_hide_sizer.Add(send_before_hide_label,proportion=1, flag=wx.EXPAND| wx.ALL) - send_before_hide_sizer.Add(send_before_hide_checkbox,proportion=1, flag=wx.EXPAND| wx.ALL) - settings_checkbox_sizer.Add(send_before_hide_sizer, proportion=1,flag=wx.EXPAND| wx.ALL, border=10) - - hide_current_sizer=wx.BoxSizer(wx.HORIZONTAL) - hide_current_label = wx.StaticText(panel, label="同时隐藏当前活动窗口") - hide_current_checkbox = wx.CheckBox(panel, self.ID_HIDE_CURRENT_CHECKBOX, "") - hide_current_sizer.Add(hide_current_label,proportion=1, flag=wx.EXPAND| wx.ALL) - hide_current_sizer.Add(hide_current_checkbox,proportion=1, flag=wx.EXPAND| wx.ALL) - settings_checkbox_sizer.Add(hide_current_sizer, proportion=1,flag=wx.EXPAND| wx.ALL, border=10) - - click_to_hide_sizer=wx.BoxSizer(wx.HORIZONTAL) - click_to_hide_label = wx.StaticText(panel, label="点击托盘图标切换隐藏状态") - click_to_hide_checkbox = wx.CheckBox(panel, self.ID_CLICK_TO_HIDE_CHECKBOX, "") - click_to_hide_sizer.Add(click_to_hide_label,proportion=1, flag=wx.EXPAND| wx.ALL) - click_to_hide_sizer.Add(click_to_hide_checkbox,proportion=1, flag=wx.EXPAND| wx.ALL) - settings_checkbox_sizer.Add(click_to_hide_sizer, proportion=1,flag=wx.EXPAND| wx.ALL, border=10) - - hide_icon_after_hide_sizer=wx.BoxSizer(wx.HORIZONTAL) - hide_icon_after_hide_label = wx.StaticText(panel, label="隐藏窗口后隐藏托盘图标") - hide_icon_after_hide_checkbox = wx.CheckBox(panel, self.ID_HIDE_ICON_AFTER_HIDE_CHECKBOX, "") - hide_icon_after_hide_sizer.Add(hide_icon_after_hide_label,proportion=1, flag=wx.EXPAND| wx.ALL) - hide_icon_after_hide_sizer.Add(hide_icon_after_hide_checkbox,proportion=1, flag=wx.EXPAND| wx.ALL) - settings_checkbox_sizer.Add(hide_icon_after_hide_sizer, proportion=1,flag=wx.EXPAND| wx.ALL, border=10) - - path_match_sizer=wx.BoxSizer(wx.HORIZONTAL) - path_icon_sizer = wx.BoxSizer(wx.HORIZONTAL) - path_match_tooltip = "启用此选项可以一键隐藏绑定程序的所有窗口\r\n关闭此选项后,将会智能精确隐藏指定窗口" - path_match_label = wx.StaticText(panel, label="文件路径匹配") - path_match_label.SetToolTip(path_match_tooltip) - path_match_checkbox = wx.CheckBox(panel, self.ID_PATH_MATCH_CHECKBOX, "") - path_match_tooltip_icon = wx.StaticBitmap(panel, bitmap=wx.ArtProvider.GetBitmap(wx.ART_INFORMATION, wx.ART_OTHER, self.FromDIP((14, 14)))) - path_match_tooltip_icon.SetToolTip(path_match_tooltip) - path_icon_sizer.Add(path_match_label,flag=wx.EXPAND| wx.ALL) - path_icon_sizer.AddSpacer(5) - path_icon_sizer.Add(path_match_tooltip_icon,flag=wx.EXPAND| wx.ALL) - path_match_sizer.Add(path_icon_sizer, proportion=1,flag=wx.EXPAND| wx.ALL) - path_match_sizer.Add(path_match_checkbox,proportion=1, flag=wx.EXPAND| wx.ALL) - settings_checkbox_sizer.Add(path_match_sizer, proportion=1,flag=wx.EXPAND| wx.ALL, border=10) - - bottom_sizer.Add(settings_checkbox_sizer, flag=wx.EXPAND| wx.ALL, border=10) - - #设置提示 - if Config.first_start: - StaticText2=wx.StaticText(panel,label="本页面仅在首次启动或内容有更新时自动显示,后续可通过托盘图标打开本页面") - bottom_sizer.Add(StaticText2, proportion=1, flag=wx.EXPAND|wx.BOTTOM, border=10) - - # 创建按钮 - button_sizer = wx.BoxSizer(wx.HORIZONTAL) - reset_btn = wx.Button(panel, self.ID_RESET_BTN, size=(100,60), label="重置设置") - save_btn = wx.Button(panel, self.ID_SAVE_BTN, size=(100,60), label="保存设置") - button_sizer.Add(reset_btn, proportion=1, flag=wx.LEFT, border=20) - button_sizer.Add(save_btn, proportion=1, flag=wx.RIGHT, border=20) - bottom_sizer.Add(button_sizer, proportion=1, flag=wx.EXPAND|wx.BOTTOM, border=10) - - # Add top and bottom sizers to the main sizer - main_sizer.Add(top_sizer, 1, wx.EXPAND | wx.ALL, 5) - main_sizer.Add(bottom_sizer, 0, wx.EXPAND | wx.ALL, 5) - - panel.SetSizer(main_sizer) - main_sizer.Fit(self) - - def Bind_EVT(self): - self.Bind(wx.EVT_BUTTON, self.OnSave, id=self.ID_SAVE_BTN) - self.Bind(wx.EVT_BUTTON, self.OnReset, id=self.ID_RESET_BTN) - self.Bind(wx.EVT_BUTTON, self.OnRecordSW, id=self.ID_HIDE_SHOW_HOTKEY_BTN) - self.Bind(wx.EVT_BUTTON, self.OnRecordCL, id=self.ID_CLOSE_HOTKEY_BTN) - self.Bind(wx.EVT_CHECKBOX, self.OnSendBeforeHide, id=self.ID_SEND_BEFORE_HIDE_CHECKBOX) - self.Bind(wx.EVT_BUTTON, self.RefreshLeftList, id=self.ID_REFRESH_BTN) - self.Bind(wx.EVT_BUTTON, self.OnAddBinding, id=self.ID_ADD_BINDING_BTN) - self.Bind(wx.EVT_BUTTON, self.OnRemoveBinding, id=self.ID_REMOVE_BINDING_BTN) - self.left_treelist.Bind(dataview.EVT_TREELIST_ITEM_CHECKED, self.OnToggleCheck) - self.right_treelist.Bind(dataview.EVT_TREELIST_ITEM_CHECKED, self.OnToggleCheck) - - self.Bind(wx.EVT_CLOSE, self.OnClose) - - def SetData(self): - Config.load() - hide_show_hotkey_text = self.FindWindowById(self.ID_HIDE_SHOW_HOTKEY_TEXT) - close_hotkey_text = self.FindWindowById(self.ID_CLOSE_HOTKEY_TEXT) - mute_after_hide_checkbox = self.FindWindowById(self.ID_MUTE_AFTER_HIDE_CHECKBOX) - send_before_hide_checkbox = self.FindWindowById(self.ID_SEND_BEFORE_HIDE_CHECKBOX) - hide_current_checkbox = self.FindWindowById(self.ID_HIDE_CURRENT_CHECKBOX) - click_to_hide_checkbox = self.FindWindowById(self.ID_CLICK_TO_HIDE_CHECKBOX) - hide_icon_after_hide_checkbox = self.FindWindowById(self.ID_HIDE_ICON_AFTER_HIDE_CHECKBOX) - path_match_checkbox = self.FindWindowById(self.ID_PATH_MATCH_CHECKBOX) - - hide_show_hotkey_text.SetValue(Config.hide_hotkey) - close_hotkey_text.SetValue(Config.close_hotkey) - mute_after_hide_checkbox.SetValue(Config.mute_after_hide) - send_before_hide_checkbox.SetValue(Config.send_before_hide) - hide_current_checkbox.SetValue(Config.hide_current) - click_to_hide_checkbox.SetValue(Config.click_to_hide) - hide_icon_after_hide_checkbox.SetValue(Config.hide_icon_after_hide) - path_match_checkbox.SetValue(Config.path_match) - self.InsertTreeList(Config.hide_binding, self.right_treelist, True) - self.RefreshLeftList() - - def OnSave(self, e): - hide_show_hotkey_text = self.FindWindowById(self.ID_HIDE_SHOW_HOTKEY_TEXT) - close_hotkey_text = self.FindWindowById(self.ID_CLOSE_HOTKEY_TEXT) - mute_after_hide_checkbox = self.FindWindowById(self.ID_MUTE_AFTER_HIDE_CHECKBOX) - send_before_hide_checkbox = self.FindWindowById(self.ID_SEND_BEFORE_HIDE_CHECKBOX) - hide_current_checkbox = self.FindWindowById(self.ID_HIDE_CURRENT_CHECKBOX) - click_to_hide_checkbox = self.FindWindowById(self.ID_CLICK_TO_HIDE_CHECKBOX) - hide_icon_after_hide_checkbox = self.FindWindowById(self.ID_HIDE_ICON_AFTER_HIDE_CHECKBOX) - path_match_checkbox = self.FindWindowById(self.ID_PATH_MATCH_CHECKBOX) - - Config.hide_hotkey = hide_show_hotkey_text.GetValue() - Config.close_hotkey = close_hotkey_text.GetValue() - Config.mute_after_hide = mute_after_hide_checkbox.GetValue() - Config.send_before_hide = send_before_hide_checkbox.GetValue() - Config.hide_current = hide_current_checkbox.GetValue() - Config.click_to_hide = click_to_hide_checkbox.GetValue() - Config.hide_icon_after_hide = hide_icon_after_hide_checkbox.GetValue() - Config.path_match = path_match_checkbox.GetValue() - - # 获取Windows对象列表 - Config.hide_binding = self.ItemsData(self.right_treelist, only_checked=False) - - Config.HotkeyListener.ShowWindows(load=False) - Config.save() - try: - Config.HotkeyListener.reBind() - wx.MessageDialog(None, u"保存成功", u"Boss Key", wx.OK | wx.ICON_INFORMATION).ShowModal() - except: - wx.MessageDialog(None, u"热键绑定失败,请重试", u"Boss Key", wx.OK | wx.ICON_ERROR).ShowModal() - - def OnAddBinding(self, e): - left_checked = self.ItemsData(self.left_treelist, only_checked=True) - self.InsertTreeList(left_checked, self.right_treelist, False) - for item in left_checked: - self.RemoveItem(self.left_treelist, item) - - def OnRemoveBinding(self, e): - right_checked = self.ItemsData(self.right_treelist, only_checked=True) - self.InsertTreeList(right_checked, self.left_treelist, False) - for item in right_checked: - self.RemoveItem(self.right_treelist, item) - - def OnReset(self, e): - hide_show_hotkey_text = self.FindWindowById(self.ID_HIDE_SHOW_HOTKEY_TEXT) - close_hotkey_text = self.FindWindowById(self.ID_CLOSE_HOTKEY_TEXT) - mute_after_hide_checkbox = self.FindWindowById(self.ID_MUTE_AFTER_HIDE_CHECKBOX) - send_before_hide_checkbox = self.FindWindowById(self.ID_SEND_BEFORE_HIDE_CHECKBOX) - hide_current_checkbox = self.FindWindowById(self.ID_HIDE_CURRENT_CHECKBOX) - click_to_hide_checkbox = self.FindWindowById(self.ID_CLICK_TO_HIDE_CHECKBOX) - hide_icon_after_hide_checkbox = self.FindWindowById(self.ID_HIDE_ICON_AFTER_HIDE_CHECKBOX) - path_match_checkbox = self.FindWindowById(self.ID_PATH_MATCH_CHECKBOX) - - hide_show_hotkey_text.SetValue("Ctrl+Q") - close_hotkey_text.SetValue("Win+Esc") - mute_after_hide_checkbox.SetValue(True) - send_before_hide_checkbox.SetValue(False) - hide_current_checkbox.SetValue(True) - click_to_hide_checkbox.SetValue(False) - hide_icon_after_hide_checkbox.SetValue(False) - path_match_checkbox.SetValue(False) - self.InsertTreeList([], self.right_treelist, True) - self.RefreshLeftList() - - wx.MessageDialog(None, u"已重置选项,请保存设置以启用", u"Boss Key", wx.OK | wx.ICON_INFORMATION).ShowModal() - - def OnToggleCheck(self, e): - treelist = e.GetEventObject() - item = e.GetItem() - is_checked = treelist.GetCheckedState(item) - - # 递归设置子节点状态 - self.CheckItemRecursively(treelist, item, is_checked) - - # 更新父节点状态 - self.UpdateParentCheckState(treelist, item) - - def CheckItemRecursively(self, treelist, item, check_state): - """递归设置项目及其子项的选中状态""" - treelist.CheckItem(item, check_state) - - # 处理所有子节点 - child = treelist.GetFirstChild(item) - while child.IsOk(): - self.CheckItemRecursively(treelist, child, check_state) - child = treelist.GetNextSibling(child) - - def UpdateParentCheckState(self, treelist, item): - """更新父节点的选中状态""" - parent = treelist.GetItemParent(item) - if parent != treelist.GetRootItem(): - # 检查所有兄弟节点状态 - all_checked = True - all_unchecked = True - - child = treelist.GetFirstChild(parent) - while child.IsOk(): - state = treelist.GetCheckedState(child) - if state != wx.CHK_CHECKED: - all_checked = False - if state != wx.CHK_UNCHECKED: - all_unchecked = False - child = treelist.GetNextSibling(child) - - # 根据子节点状态设置父节点状态 - if all_checked: - treelist.CheckItem(parent, wx.CHK_CHECKED) - elif all_unchecked: - treelist.CheckItem(parent, wx.CHK_UNCHECKED) - else: - treelist.CheckItem(parent, wx.CHK_UNDETERMINED) - - # 递归更新上层父节点 - self.UpdateParentCheckState(treelist, parent) - - def OnSendBeforeHide(self, e): - send_before_hide_checkbox = self.FindWindowById(self.ID_SEND_BEFORE_HIDE_CHECKBOX) - if send_before_hide_checkbox.GetValue(): - wx.MessageDialog(None, u"隐藏窗口前向被隐藏的窗口发送空格,用于暂停视频等。启用此功能可能会延迟窗口的隐藏", u"Boss Key", wx.OK | wx.ICON_INFORMATION).ShowModal() - - def OnRecordSW(self, e): - hide_show_hotkey_text = self.FindWindowById(self.ID_HIDE_SHOW_HOTKEY_TEXT) - hide_show_hotkey_btn = self.FindWindowById(self.ID_HIDE_SHOW_HOTKEY_BTN) - self.recordHotkey(hide_show_hotkey_text, hide_show_hotkey_btn) - - def OnClose(self, e): - self.Hide() - - def OnRecordCL(self, e): - close_hotkey_text = self.FindWindowById(self.ID_CLOSE_HOTKEY_TEXT) - close_hotkey_btn = self.FindWindowById(self.ID_CLOSE_HOTKEY_BTN) - self.recordHotkey(close_hotkey_text, close_hotkey_btn) - - def RefreshLeftList(self, e=None): - windows = tool.getAllWindows() - right = self.ItemsData(self.right_treelist, only_checked=False) - list = [] - for window in windows: - flag = 0 - for i in right: - if tool.isSameWindow(window, i, True): - flag = 1 - break - if not flag: - list.append(window) - self.InsertTreeList(list, self.left_treelist, True) - - def InsertTreeList(self, data: list, treelist: dataview.TreeListCtrl, clear=True): - if clear: - treelist.DeleteAllItems() - root = treelist.GetRootItem() - process_map = {} - for window in data: - # 确保window是WindowInfo对象 - if isinstance(window, dict): - window = WindowInfo.from_dict(window) - - process = window.process - if process not in process_map: - exists_node = self.SearchProcessNode(treelist, process) - if exists_node is None: - process_map[process] = treelist.AppendItem(root, process) - else: - process_map[process] = exists_node - item = treelist.AppendItem(process_map[process], window.title) - treelist.SetItemText(item, 1, str(window.hwnd)) - treelist.SetItemText(item, 2, str(window.PID)) - treelist.SetItemData(item, window) - treelist.Expand(root) - for process in process_map: - treelist.Expand(process_map[process]) - - # 初始化所有父节点的选中状态 - for process in process_map: - self.UpdateParentCheckState(treelist, treelist.GetFirstChild(process_map[process])) - - def SearchProcessNode(self, treelist: dataview.TreeListCtrl, process): - item = treelist.GetRootItem() - while item.IsOk(): - item = treelist.GetNextItem(item) - if not item.IsOk(): - break - data = treelist.GetItemData(item) - if data is not None and hasattr(data, 'process') and data.process == process: - return treelist.GetItemParent(item) - - def RemoveItem(self, treelist: dataview.TreeListCtrl, data): - # 确保data是WindowInfo对象 - if isinstance(data, dict): - data = WindowInfo.from_dict(data) - - node = item = self.SearchProcessNode(treelist, data.process) - if item is not None: - item = treelist.GetFirstChild(item) - while item.IsOk(): - item_data = treelist.GetItemData(item) - if item_data and item_data == data: - treelist.DeleteItem(item) - break - item = treelist.GetNextSibling(item) - - if not treelist.GetFirstChild(node).IsOk(): - # 如果没有子节点了,删除父节点 - treelist.DeleteItem(node) - - def ItemsData(self, treelist: dataview.TreeListCtrl, only_checked=False, item_object=False)->list[WindowInfo]: - res = [] - item = treelist.GetRootItem() - while item.IsOk(): - item = treelist.GetNextItem(item) - if not item.IsOk(): - break - if only_checked and treelist.GetCheckedState(item) != wx.CHK_CHECKED: - continue - if item_object: - res.append(item) - else: - data = treelist.GetItemData(item) - if data is not None and data: - res.append(data) - return res - - def recordHotkey(self, text_ctrl: wx.TextCtrl, btn: wx.Button): - try: - Config.HotkeyListener.stop() - except: - pass - btn.Disable() - btn.SetLabel("录制中...") - record.RecordedHotkey.confirm = False - RecordWindow = record.RecordWindow() - RecordWindow.ShowModal() - btn.Enable() - btn.SetLabel("录制热键") - if record.RecordedHotkey.confirm: - text_ctrl.SetValue(record.RecordedHotkey.final_key) - - diff --git a/main/GUI/setting/__init__.py b/main/GUI/setting/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/main/GUI/setting/base.py b/main/GUI/setting/base.py new file mode 100644 index 0000000..6a630a4 --- /dev/null +++ b/main/GUI/setting/base.py @@ -0,0 +1,92 @@ +import wx +from core.config import Config +import core.tools as tool +from .binding_page import BindingPage +from .hotkeys_page import HotkeysPage +from .options_page import OptionsPage + +class SettingWindow(wx.Frame): + def __init__(self, id=None): + super().__init__(None, id=id, title="设置 - Boss Key", style=wx.DEFAULT_FRAME_STYLE | wx.RESIZE_BORDER) + self.SetIcon(wx.Icon(wx.Image(Config.icon).ConvertToBitmap())) + + self.init_UI() + self.Bind_EVT() + self.SetData() + self.SetSize((1500, 800)) + self.Center() + + def init_UI(self): + panel = wx.Panel(self) + sizer = wx.BoxSizer(wx.VERTICAL) + + # 创建notebook + self.notebook = wx.Notebook(panel) + + # 添加各个设置页面 + self.binding_page = BindingPage(self.notebook) + self.hotkeys_page = HotkeysPage(self.notebook) + self.options_page = OptionsPage(self.notebook) + + self.notebook.AddPage(self.binding_page, "窗口绑定") + self.notebook.AddPage(self.hotkeys_page, "热键设置") + self.notebook.AddPage(self.options_page, "其他选项") + + sizer.Add(self.notebook, 1, wx.EXPAND | wx.ALL, 5) + + # 创建按钮 + button_sizer = wx.BoxSizer(wx.HORIZONTAL) + self.reset_btn = wx.Button(panel, label="重置设置") + self.save_btn = wx.Button(panel, label="保存设置") + 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) + + sizer.Add(button_sizer, 0, wx.EXPAND | wx.ALL, 10) + + # 设置提示 + if Config.first_start: + static_text = wx.StaticText(panel, label="本页面仅在首次启动或内容有更新时自动显示,后续可通过托盘图标打开本页面") + sizer.Add(static_text, 0, wx.EXPAND | wx.BOTTOM, 10) + + panel.SetSizer(sizer) + sizer.Fit(self) + + def Bind_EVT(self): + self.save_btn.Bind(wx.EVT_BUTTON, self.OnSave) + self.reset_btn.Bind(wx.EVT_BUTTON, self.OnReset) + self.Bind(wx.EVT_CLOSE, self.OnClose) + + def SetData(self): + Config.load() + self.binding_page.SetData() + self.hotkeys_page.SetData() + self.options_page.SetData() + + def OnSave(self, e): + # 从各页面获取数据 + self.binding_page.SaveData() + self.hotkeys_page.SaveData() + self.options_page.SaveData() + + # 应用更改 + Config.HotkeyListener.ShowWindows(load=False) + Config.save() + try: + Config.HotkeyListener.reBind() + wx.MessageDialog(None, "保存成功", "Boss Key", wx.OK | wx.ICON_INFORMATION).ShowModal() + except: + wx.MessageDialog(None, "热键绑定失败,请重试", "Boss Key", wx.OK | wx.ICON_ERROR).ShowModal() + + def OnReset(self, e): + # 重置所有设置 + self.binding_page.Reset() + self.hotkeys_page.Reset() + self.options_page.Reset() + wx.MessageDialog(None, "已重置选项,请保存设置以启用", "Boss Key", wx.OK | wx.ICON_INFORMATION).ShowModal() + + def OnClose(self, e): + self.Hide() + + def RefreshLeftList(self, e=None): + """刷新左侧列表,供外部调用""" + self.binding_page.RefreshLeftList() diff --git a/main/GUI/setting/binding_page.py b/main/GUI/setting/binding_page.py new file mode 100644 index 0000000..16d4b95 --- /dev/null +++ b/main/GUI/setting/binding_page.py @@ -0,0 +1,220 @@ +import wx +import wx.dataview as dataview +import wx.lib.buttons as buttons +from core.config import Config +import core.tools as tool +from core.model import WindowInfo + +class BindingPage(wx.Panel): + def __init__(self, parent): + super().__init__(parent) + self.init_UI() + self.Bind_EVT() + + def init_UI(self): + # 主 sizer + main_sizer = wx.BoxSizer(wx.HORIZONTAL) + + # 左边列表 + left_staticbox = wx.StaticBox(self, label="现有窗口进程") + left_sizer = wx.StaticBoxSizer(left_staticbox, wx.VERTICAL) + self.left_treelist = dataview.TreeListCtrl(self, style=dataview.TL_CHECKBOX) + self.left_treelist.AppendColumn('窗口标题', width=300) + self.left_treelist.AppendColumn('窗口句柄', width=100) + self.left_treelist.AppendColumn('进程PID', width=150) + left_sizer.Add(self.left_treelist, 1, wx.EXPAND | wx.ALL, 5) + + # 中键按钮 + middle_sizer = wx.BoxSizer(wx.VERTICAL) + self.add_binding_btn = buttons.GenButton(self, label="添加绑定-->") + self.remove_binding_btn = buttons.GenButton(self, label="<--删除绑定") + self.refresh_btn = buttons.GenButton(self, label="刷新进程") + middle_sizer.Add(self.add_binding_btn, 0, wx.EXPAND | wx.ALL, 5) + middle_sizer.Add(self.remove_binding_btn, 0, wx.EXPAND | wx.ALL, 5) + middle_sizer.Add(self.refresh_btn, 0, wx.EXPAND | wx.ALL, 5) + + # 右边列表 + right_staticbox = wx.StaticBox(self, label="已绑定进程") + right_sizer = wx.StaticBoxSizer(right_staticbox, wx.VERTICAL) + self.right_treelist = dataview.TreeListCtrl(self, style=dataview.TL_CHECKBOX) + self.right_treelist.AppendColumn('窗口标题', width=300) + self.right_treelist.AppendColumn('窗口句柄', width=100) + self.right_treelist.AppendColumn('进程PID', width=150) + right_sizer.Add(self.right_treelist, 1, wx.EXPAND | wx.ALL, 5) + + # 加到主sizer中 + main_sizer.Add(left_sizer, 1, wx.EXPAND | wx.ALL, 5) + main_sizer.Add(middle_sizer, 0, wx.EXPAND | wx.ALL, 5) + main_sizer.Add(right_sizer, 1, wx.EXPAND | wx.ALL, 5) + + self.SetSizer(main_sizer) + + def Bind_EVT(self): + self.add_binding_btn.Bind(wx.EVT_BUTTON, self.OnAddBinding) + self.remove_binding_btn.Bind(wx.EVT_BUTTON, self.OnRemoveBinding) + self.refresh_btn.Bind(wx.EVT_BUTTON, self.RefreshLeftList) + self.left_treelist.Bind(dataview.EVT_TREELIST_ITEM_CHECKED, self.OnToggleCheck) + self.right_treelist.Bind(dataview.EVT_TREELIST_ITEM_CHECKED, self.OnToggleCheck) + + def SetData(self): + self.InsertTreeList(Config.hide_binding, self.right_treelist, True) + self.RefreshLeftList() + + def SaveData(self): + # 获取已绑定窗口列表 + Config.hide_binding = self.ItemsData(self.right_treelist, only_checked=False) + + def Reset(self): + self.InsertTreeList([], self.right_treelist, True) + self.RefreshLeftList() + + def OnAddBinding(self, e): + left_checked = self.ItemsData(self.left_treelist, only_checked=True) + self.InsertTreeList(left_checked, self.right_treelist, False) + for item in left_checked: + self.RemoveItem(self.left_treelist, item) + + def OnRemoveBinding(self, e): + right_checked = self.ItemsData(self.right_treelist, only_checked=True) + self.InsertTreeList(right_checked, self.left_treelist, False) + for item in right_checked: + self.RemoveItem(self.right_treelist, item) + + def RefreshLeftList(self, e=None): + windows = tool.getAllWindows() + right = self.ItemsData(self.right_treelist, only_checked=False) + list = [] + for window in windows: + flag = 0 + for i in right: + if tool.isSameWindow(window, i, True): + flag = 1 + break + if not flag: + list.append(window) + self.InsertTreeList(list, self.left_treelist, True) + + def OnToggleCheck(self, e): + treelist = e.GetEventObject() + item = e.GetItem() + is_checked = treelist.GetCheckedState(item) + + # 递归设置子节点状态 + self.CheckItemRecursively(treelist, item, is_checked) + + # 更新父节点状态 + self.UpdateParentCheckState(treelist, item) + + def CheckItemRecursively(self, treelist, item, check_state): + """递归设置项目及其子项的选中状态""" + treelist.CheckItem(item, check_state) + + # 处理所有子节点 + child = treelist.GetFirstChild(item) + while child.IsOk(): + self.CheckItemRecursively(treelist, child, check_state) + child = treelist.GetNextSibling(child) + + def UpdateParentCheckState(self, treelist, item): + """更新父节点的选中状态""" + parent = treelist.GetItemParent(item) + if parent != treelist.GetRootItem(): + # 检查所有兄弟节点状态 + all_checked = True + all_unchecked = True + + child = treelist.GetFirstChild(parent) + while child.IsOk(): + state = treelist.GetCheckedState(child) + if state != wx.CHK_CHECKED: + all_checked = False + if state != wx.CHK_UNCHECKED: + all_unchecked = False + child = treelist.GetNextSibling(child) + + # 根据子节点状态设置父节点状态 + if all_checked: + treelist.CheckItem(parent, wx.CHK_CHECKED) + elif all_unchecked: + treelist.CheckItem(parent, wx.CHK_UNCHECKED) + else: + treelist.CheckItem(parent, wx.CHK_UNDETERMINED) + + # 递归更新上层父节点 + self.UpdateParentCheckState(treelist, parent) + + def InsertTreeList(self, data: list, treelist: dataview.TreeListCtrl, clear=True): + if clear: + treelist.DeleteAllItems() + root = treelist.GetRootItem() + process_map = {} + for window in data: + # 确保window是WindowInfo对象 + if isinstance(window, dict): + window = WindowInfo.from_dict(window) + + process = window.process + if process not in process_map: + exists_node = self.SearchProcessNode(treelist, process) + if exists_node is None: + process_map[process] = treelist.AppendItem(root, process) + else: + process_map[process] = exists_node + item = treelist.AppendItem(process_map[process], window.title) + treelist.SetItemText(item, 1, str(window.hwnd)) + treelist.SetItemText(item, 2, str(window.PID)) + treelist.SetItemData(item, window) + treelist.Expand(root) + for process in process_map: + treelist.Expand(process_map[process]) + + # 初始化所有父节点的选中状态 + for process in process_map: + if treelist.GetFirstChild(process_map[process]).IsOk(): + self.UpdateParentCheckState(treelist, treelist.GetFirstChild(process_map[process])) + + def SearchProcessNode(self, treelist: dataview.TreeListCtrl, process): + item = treelist.GetRootItem() + while item.IsOk(): + item = treelist.GetNextItem(item) + if not item.IsOk(): + break + data = treelist.GetItemData(item) + if data is not None and hasattr(data, 'process') and data.process == process: + return treelist.GetItemParent(item) + + def RemoveItem(self, treelist: dataview.TreeListCtrl, data): + # 确保data是WindowInfo对象 + if isinstance(data, dict): + data = WindowInfo.from_dict(data) + + node = self.SearchProcessNode(treelist, data.process) + if node is not None: + item = treelist.GetFirstChild(node) + while item.IsOk(): + item_data = treelist.GetItemData(item) + if item_data and item_data == data: + treelist.DeleteItem(item) + break + item = treelist.GetNextSibling(item) + + if not treelist.GetFirstChild(node).IsOk(): + # 如果没有子节点了,删除父节点 + treelist.DeleteItem(node) + + def ItemsData(self, treelist: dataview.TreeListCtrl, only_checked=False, item_object=False)->list[WindowInfo]: + res = [] + item = treelist.GetRootItem() + while item.IsOk(): + item = treelist.GetNextItem(item) + if not item.IsOk(): + break + if only_checked and treelist.GetCheckedState(item) != wx.CHK_CHECKED: + continue + if item_object: + res.append(item) + else: + data = treelist.GetItemData(item) + if data is not None and data: + res.append(data) + return res \ No newline at end of file diff --git a/main/GUI/setting/hotkeys_page.py b/main/GUI/setting/hotkeys_page.py new file mode 100644 index 0000000..f49466d --- /dev/null +++ b/main/GUI/setting/hotkeys_page.py @@ -0,0 +1,79 @@ +import wx +from core.config import Config +import GUI.record as record + +class HotkeysPage(wx.Panel): + def __init__(self, parent): + super().__init__(parent) + self.init_UI() + self.Bind_EVT() + + def init_UI(self): + sizer = wx.BoxSizer(wx.VERTICAL) + + # 创建网格布局 + grid_sizer = wx.FlexGridSizer(rows=2, cols=3, gap=(10, 20)) + grid_sizer.AddGrowableCol(1, 1) + + # 隐藏/显示窗口热键 + hide_show_label = wx.StaticText(self, label="隐藏/显示窗口热键:") + self.hide_show_text = wx.TextCtrl(self) + self.hide_show_btn = wx.Button(self, label="录制热键") + + grid_sizer.Add(hide_show_label, 0, wx.ALIGN_CENTER_VERTICAL | wx.ALL, 10) + grid_sizer.Add(self.hide_show_text, 1, wx.EXPAND | wx.ALL, 10) + grid_sizer.Add(self.hide_show_btn, 0, wx.EXPAND | wx.ALL, 10) + + # 一键关闭程序热键 + close_label = wx.StaticText(self, label="一键关闭程序热键:") + self.close_text = wx.TextCtrl(self) + self.close_btn = wx.Button(self, label="录制热键") + + grid_sizer.Add(close_label, 0, wx.ALIGN_CENTER_VERTICAL | wx.ALL, 10) + 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) + + # 添加说明文本 + help_text = wx.StaticText(self, label="提示: 点击录制热键按钮后,按下您想要设置的热键组合,然后点击确定。") + sizer.Add(help_text, 0, wx.ALL, 20) + + 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) + + def SetData(self): + self.hide_show_text.SetValue(Config.hide_hotkey) + self.close_text.SetValue(Config.close_hotkey) + + def SaveData(self): + Config.hide_hotkey = self.hide_show_text.GetValue() + Config.close_hotkey = self.close_text.GetValue() + + def Reset(self): + self.hide_show_text.SetValue("Ctrl+Q") + self.close_text.SetValue("Win+Esc") + + def OnRecordHideShow(self, e): + self.recordHotkey(self.hide_show_text, self.hide_show_btn) + + def OnRecordClose(self, e): + self.recordHotkey(self.close_text, self.close_btn) + + def recordHotkey(self, text_ctrl: wx.TextCtrl, btn: wx.Button): + try: + Config.HotkeyListener.stop() + except: + pass + btn.Disable() + btn.SetLabel("录制中...") + record.RecordedHotkey.confirm = False + RecordWindow = record.RecordWindow() + RecordWindow.ShowModal() + btn.Enable() + btn.SetLabel("录制热键") + if record.RecordedHotkey.confirm: + text_ctrl.SetValue(record.RecordedHotkey.final_key) \ No newline at end of file diff --git a/main/GUI/setting/options_page.py b/main/GUI/setting/options_page.py new file mode 100644 index 0000000..61822d1 --- /dev/null +++ b/main/GUI/setting/options_page.py @@ -0,0 +1,86 @@ +import wx +from core.config import Config + +class OptionsPage(wx.Panel): + def __init__(self, parent): + super().__init__(parent) + self.init_UI() + self.Bind_EVT() + + def init_UI(self): + sizer = wx.BoxSizer(wx.VERTICAL) + + # 创建网格布局 + grid_sizer = wx.GridSizer(rows=3, cols=2, gap=(10, 20)) + + # 添加复选框 + # 1. 隐藏窗口后静音 + self.mute_checkbox = wx.CheckBox(self, label="隐藏窗口后静音") + grid_sizer.Add(self.mute_checkbox, 0, wx.ALL, 10) + + # 2. 隐藏前发送暂停键(Beta) + pause_sizer = wx.BoxSizer(wx.HORIZONTAL) + self.send_pause_checkbox = wx.CheckBox(self, label="隐藏前发送暂停键(Beta)") + self.send_pause_checkbox.SetToolTip(wx.ToolTip("隐藏窗口前发送暂停键,用于关闭弹出的输入框等,隐藏窗口会存在一定的延迟")) + pause_sizer.Add(self.send_pause_checkbox) + grid_sizer.Add(pause_sizer, 0, wx.ALL, 10) + + # 3. 同时隐藏当前活动窗口 + self.hide_current_checkbox = wx.CheckBox(self, label="同时隐藏当前活动窗口") + grid_sizer.Add(self.hide_current_checkbox, 0, wx.ALL, 10) + + # 4. 点击托盘图标切换隐藏状态 + self.click_hide_checkbox = wx.CheckBox(self, label="点击托盘图标切换隐藏状态") + grid_sizer.Add(self.click_hide_checkbox, 0, wx.ALL, 10) + + # 5. 隐藏窗口后隐藏托盘图标 + self.hide_icon_checkbox = wx.CheckBox(self, label="隐藏窗口后隐藏托盘图标") + grid_sizer.Add(self.hide_icon_checkbox, 0, wx.ALL, 10) + + # 6. 文件路径匹配 + path_sizer = wx.BoxSizer(wx.HORIZONTAL) + self.path_match_checkbox = wx.CheckBox(self, label="文件路径匹配") + path_tooltip = "启用此选项可以一键隐藏绑定程序的所有窗口\n关闭此选项后,将会智能精确隐藏指定窗口" + self.path_match_checkbox.SetToolTip(wx.ToolTip(path_tooltip)) + info_icon = wx.ArtProvider.GetBitmap(wx.ART_INFORMATION, wx.ART_OTHER, self.FromDIP((14, 14))) + info_bitmap = wx.StaticBitmap(self, bitmap=info_icon) + info_bitmap.SetToolTip(wx.ToolTip(path_tooltip)) + path_sizer.Add(self.path_match_checkbox) + path_sizer.AddSpacer(5) + path_sizer.Add(info_bitmap) + grid_sizer.Add(path_sizer, 0, wx.ALL, 10) + + sizer.Add(grid_sizer, 0, wx.EXPAND | wx.ALL, 20) + + self.SetSizer(sizer) + + def Bind_EVT(self): + self.send_pause_checkbox.Bind(wx.EVT_CHECKBOX, self.OnSendBeforeHide) + + def SetData(self): + self.mute_checkbox.SetValue(Config.mute_after_hide) + self.send_pause_checkbox.SetValue(Config.send_before_hide) + self.hide_current_checkbox.SetValue(Config.hide_current) + self.click_hide_checkbox.SetValue(Config.click_to_hide) + self.hide_icon_checkbox.SetValue(Config.hide_icon_after_hide) + self.path_match_checkbox.SetValue(Config.path_match) + + def SaveData(self): + Config.mute_after_hide = self.mute_checkbox.GetValue() + Config.send_before_hide = self.send_pause_checkbox.GetValue() + Config.hide_current = self.hide_current_checkbox.GetValue() + Config.click_to_hide = self.click_hide_checkbox.GetValue() + Config.hide_icon_after_hide = self.hide_icon_checkbox.GetValue() + Config.path_match = self.path_match_checkbox.GetValue() + + def Reset(self): + self.mute_checkbox.SetValue(True) + self.send_pause_checkbox.SetValue(False) + self.hide_current_checkbox.SetValue(True) + self.click_hide_checkbox.SetValue(False) + self.hide_icon_checkbox.SetValue(False) + self.path_match_checkbox.SetValue(False) + + def OnSendBeforeHide(self, e): + if self.send_pause_checkbox.GetValue(): + wx.MessageDialog(None, "隐藏窗口前向被隐藏的窗口发送空格,用于暂停视频等。启用此功能可能会延迟窗口的隐藏", "Boss Key", wx.OK | wx.ICON_INFORMATION).ShowModal() \ No newline at end of file diff --git a/main/GUI/window_restore.py b/main/GUI/window_restore.py index f4cccbc..2e764d0 100644 --- a/main/GUI/window_restore.py +++ b/main/GUI/window_restore.py @@ -2,43 +2,43 @@ import wx.dataview as dataview import win32gui import win32con -from .setting import SettingWindow from core import tools as tool +from core.model import WindowInfo +from core.config import Config +from GUI.setting.binding_page import BindingPage -class WindowRestoreDialog(SettingWindow): - def __init__(self, id): - super().__init__(id=id) - self.SetSize((700, 600)) - - self.SetTitle("窗口恢复") - - self.Center() +class WindowRestorePanel(BindingPage): + """继承BindingPage实现窗口恢复的面板""" + def __init__(self, parent): + super().__init__(parent) def init_UI(self): - self.window_info = [] - # 创建界面 - panel = wx.Panel(self) - vbox = wx.BoxSizer(wx.VERTICAL) + main_sizer = wx.BoxSizer(wx.VERTICAL) - # 树形列表 - self.left_treelist = dataview.TreeListCtrl(panel, style=dataview.TL_CHECKBOX) + # 树形列表 - 复用BindingPage的列表设置方式 + self.left_treelist = dataview.TreeListCtrl(self, style=dataview.TL_CHECKBOX) self.left_treelist.AppendColumn('窗口标题', width=300) self.left_treelist.AppendColumn('窗口句柄', width=100) self.left_treelist.AppendColumn('进程PID', width=150) # 按钮区域 btn_sizer = wx.BoxSizer(wx.HORIZONTAL) - self.show_btn = wx.Button(panel, label="显示窗口") - self.hide_btn = wx.Button(panel, label="隐藏窗口") + self.show_btn = wx.Button(self, label="显示窗口") + self.hide_btn = wx.Button(self, label="隐藏窗口") btn_sizer.Add(self.show_btn, proportion=1, flag=wx.RIGHT, border=5) btn_sizer.Add(self.hide_btn, proportion=1, flag=wx.LEFT, border=5) # 布局 - vbox.Add(self.left_treelist, proportion=1, flag=wx.EXPAND|wx.LEFT|wx.RIGHT, border=5) - vbox.Add(btn_sizer, flag=wx.EXPAND|wx.ALL, border=10) + main_sizer.Add(self.left_treelist, proportion=1, flag=wx.EXPAND|wx.LEFT|wx.RIGHT, border=5) + main_sizer.Add(btn_sizer, flag=wx.EXPAND|wx.ALL, border=10) + + self.SetSizer(main_sizer) - panel.SetSizer(vbox) + def Bind_EVT(self): + self.show_btn.Bind(wx.EVT_BUTTON, self.on_show_window) + self.hide_btn.Bind(wx.EVT_BUTTON, self.on_hide_window) + self.left_treelist.Bind(dataview.EVT_TREELIST_ITEM_CHECKED, self.OnToggleCheck) def SetData(self): self.RefreshLeftList() @@ -49,13 +49,8 @@ def RefreshLeftList(self, e=None): for window in windows: list.append(window) self.InsertTreeList(list, self.left_treelist, True) - - def Bind_EVT(self): - self.show_btn.Bind(wx.EVT_BUTTON, self.on_show_window) - self.hide_btn.Bind(wx.EVT_BUTTON, self.on_hide_window) - self.left_treelist.Bind(dataview.EVT_TREELIST_ITEM_CHECKED, self.OnToggleCheck) - - def on_show_window(self,e=None): + + def on_show_window(self, e=None): windows = self.ItemsData(self.left_treelist, only_checked=True) result = wx.MessageBox(f"将恢复{len(windows)}个窗口\r\n恢复未知的窗口可能会导致窗口出错", "警告", wx.OK | wx.CANCEL | wx.ICON_WARNING) if result != wx.OK: @@ -63,11 +58,33 @@ def on_show_window(self,e=None): for window in windows: win32gui.ShowWindow(window.hwnd, win32con.SW_SHOW) - def on_hide_window(self,e=None): + def on_hide_window(self, e=None): windows = self.ItemsData(self.left_treelist, only_checked=True) result = wx.MessageBox(f"将隐藏{len(windows)}个窗口\r\n隐藏未知的窗口可能会导致窗口出错", "警告", wx.OK | wx.CANCEL | wx.ICON_WARNING) if result != wx.OK: return for window in windows: win32gui.ShowWindow(window.hwnd, win32con.SW_HIDE) - \ No newline at end of file + + +class WindowRestoreDialog(wx.Frame): + def __init__(self, id): + wx.Frame.__init__(self, None, id=id, title="窗口恢复工具 - Boss Key", style=wx.DEFAULT_FRAME_STYLE | wx.RESIZE_BORDER) + self.SetIcon(wx.Icon(wx.Image(Config.icon).ConvertToBitmap())) + self.SetSize((700, 600)) + self.Center() + + # 使用继承自BindingPage的面板 + self.panel = WindowRestorePanel(self) + + # 创建框架布局 + sizer = wx.BoxSizer(wx.VERTICAL) + sizer.Add(self.panel, 1, wx.EXPAND) + self.SetSizer(sizer) + + # 设置初始数据 + self.panel.SetData() + + def Restore(self): + """恢复窗口,用于taskbar.py中调用""" + self.Show() \ No newline at end of file From 76ae0c32c0cd2c47b524bd887b6baf12443907da Mon Sep 17 00:00:00 2001 From: Ivan Hanloth Date: Sun, 20 Apr 2025 21:18:42 +0800 Subject: [PATCH 02/18] =?UTF-8?q?=E5=A2=9E=E5=8A=A0=E7=AA=97=E5=8F=A3?= =?UTF-8?q?=E5=86=BB=E7=BB=93=E5=B7=A5=E5=85=B7?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- main/GUI/setting.py | 0 main/GUI/setting/hotkeys_page.py | 3 - main/GUI/setting/options_page.py | 114 ++++++++++++++++++++++++- main/GUI/window_restore.py | 142 +++++++++++++++++++++++++++++-- main/core/config.py | 13 ++- main/core/listener.py | 44 +++++++++- main/core/tools.py | 99 +++++++++++++++++++++ 7 files changed, 399 insertions(+), 16 deletions(-) delete mode 100644 main/GUI/setting.py diff --git a/main/GUI/setting.py b/main/GUI/setting.py deleted file mode 100644 index e69de29..0000000 diff --git a/main/GUI/setting/hotkeys_page.py b/main/GUI/setting/hotkeys_page.py index f49466d..b3cd07f 100644 --- a/main/GUI/setting/hotkeys_page.py +++ b/main/GUI/setting/hotkeys_page.py @@ -35,9 +35,6 @@ def init_UI(self): sizer.Add(grid_sizer, 0, wx.EXPAND | wx.ALL, 10) - # 添加说明文本 - help_text = wx.StaticText(self, label="提示: 点击录制热键按钮后,按下您想要设置的热键组合,然后点击确定。") - sizer.Add(help_text, 0, wx.ALL, 20) self.SetSizer(sizer) diff --git a/main/GUI/setting/options_page.py b/main/GUI/setting/options_page.py index 61822d1..b9b0d19 100644 --- a/main/GUI/setting/options_page.py +++ b/main/GUI/setting/options_page.py @@ -1,5 +1,9 @@ import wx +import wx.adv +import webbrowser from core.config import Config +import os +from core.tools import check_pssuspend_exists, is_admin, run_as_admin class OptionsPage(wx.Panel): def __init__(self, parent): @@ -11,7 +15,7 @@ def init_UI(self): sizer = wx.BoxSizer(wx.VERTICAL) # 创建网格布局 - grid_sizer = wx.GridSizer(rows=3, cols=2, gap=(10, 20)) + grid_sizer = wx.GridSizer(rows=3, cols=2, gap=(10, 20)) # 减少行数为3,冻结选项将单独放置 # 添加复选框 # 1. 隐藏窗口后静音 @@ -52,10 +56,54 @@ def init_UI(self): sizer.Add(grid_sizer, 0, wx.EXPAND | wx.ALL, 20) + # 创建一个StaticBox用于包含冻结相关的选项 + freeze_box = wx.StaticBox(self, label="进程冻结选项") + freeze_box_sizer = wx.StaticBoxSizer(freeze_box, wx.VERTICAL) + + # 创建进程冻结选项 + freeze_grid = wx.GridSizer(rows=2, cols=1, gap=(5, 5)) + + # 7. 隐藏窗口时冻结进程 + freeze_sizer = wx.BoxSizer(wx.HORIZONTAL) + self.freeze_checkbox = wx.CheckBox(self, label="隐藏窗口时冻结进程(beta)") + freeze_tooltip = "启用此选项将在隐藏窗口时同时冻结其进程,减少CPU占用\n注意:某些程序可能对冻结操作反应异常" + self.freeze_checkbox.SetToolTip(wx.ToolTip(freeze_tooltip)) + freeze_info_icon = wx.ArtProvider.GetBitmap(wx.ART_INFORMATION, wx.ART_OTHER, self.FromDIP((14, 14))) + freeze_info_bitmap = wx.StaticBitmap(self, bitmap=freeze_info_icon) + freeze_info_bitmap.SetToolTip(wx.ToolTip(freeze_tooltip)) + freeze_sizer.Add(self.freeze_checkbox) + freeze_sizer.AddSpacer(5) + freeze_sizer.Add(freeze_info_bitmap) + freeze_grid.Add(freeze_sizer, 0, wx.ALL, 5) + + # 8. 增强冻结(使用pssuspend64) + enhanced_freeze_sizer = wx.BoxSizer(wx.HORIZONTAL) + self.enhanced_freeze_checkbox = wx.CheckBox(self, label="使用增强冻结(需要pssuspend64.exe)") + enhanced_freeze_tooltip = "使用Microsoft的pssuspend64工具执行进程冻结操作,提供更稳定的冻结效果\n需要在程序根目录放置pssuspend64.exe文件并使用管理员身份启动BossKey" + self.enhanced_freeze_checkbox.SetToolTip(wx.ToolTip(enhanced_freeze_tooltip)) + enhanced_freeze_info_icon = wx.ArtProvider.GetBitmap(wx.ART_INFORMATION, wx.ART_OTHER, self.FromDIP((14, 14))) + enhanced_freeze_info_bitmap = wx.StaticBitmap(self, bitmap=enhanced_freeze_info_icon) + enhanced_freeze_info_bitmap.SetToolTip(wx.ToolTip(enhanced_freeze_tooltip)) + enhanced_freeze_sizer.Add(self.enhanced_freeze_checkbox) + enhanced_freeze_sizer.AddSpacer(5) + enhanced_freeze_sizer.Add(enhanced_freeze_info_bitmap) + freeze_grid.Add(enhanced_freeze_sizer, 0, wx.ALL, 5) + + freeze_box_sizer.Add(freeze_grid, 0, wx.ALL | wx.EXPAND, 5) + + # 添加一个下载链接 + self.download_link = wx.adv.HyperlinkCtrl(self, -1, "下载 pssuspend64", + "https://download.sysinternals.com/files/PSTools.zip") + freeze_box_sizer.Add(self.download_link, 0, wx.ALL, 10) + + sizer.Add(freeze_box_sizer, 0, wx.EXPAND | wx.ALL, 20) + self.SetSizer(sizer) def Bind_EVT(self): self.send_pause_checkbox.Bind(wx.EVT_CHECKBOX, self.OnSendBeforeHide) + self.freeze_checkbox.Bind(wx.EVT_CHECKBOX, self.OnFreezeAfterHide) + self.enhanced_freeze_checkbox.Bind(wx.EVT_CHECKBOX, self.OnEnhancedFreeze) def SetData(self): self.mute_checkbox.SetValue(Config.mute_after_hide) @@ -64,6 +112,28 @@ def SetData(self): self.click_hide_checkbox.SetValue(Config.click_to_hide) self.hide_icon_checkbox.SetValue(Config.hide_icon_after_hide) self.path_match_checkbox.SetValue(Config.path_match) + self.freeze_checkbox.SetValue(Config.freeze_after_hide) + + # 设置增强冻结选项 + if hasattr(Config, 'enhanced_freeze'): + self.enhanced_freeze_checkbox.SetValue(Config.enhanced_freeze) + else: + self.enhanced_freeze_checkbox.SetValue(False) + + # 检查pssuspend64是否存在和管理员权限 + admin_status = is_admin() + has_pssuspend = check_pssuspend_exists() + + if not has_pssuspend: + self.enhanced_freeze_checkbox.SetValue(False) + self.enhanced_freeze_checkbox.Enable(False) + self.enhanced_freeze_checkbox.SetToolTip(wx.ToolTip("需要pssuspend64.exe才能启用此功能")) + elif not admin_status: + self.enhanced_freeze_checkbox.SetValue(False) + self.enhanced_freeze_checkbox.Enable(False) + self.enhanced_freeze_checkbox.SetToolTip(wx.ToolTip("需要管理员权限才能启用此功能")) + else: + self.enhanced_freeze_checkbox.Enable(True) def SaveData(self): Config.mute_after_hide = self.mute_checkbox.GetValue() @@ -72,6 +142,8 @@ def SaveData(self): Config.click_to_hide = self.click_hide_checkbox.GetValue() Config.hide_icon_after_hide = self.hide_icon_checkbox.GetValue() Config.path_match = self.path_match_checkbox.GetValue() + Config.freeze_after_hide = self.freeze_checkbox.GetValue() + Config.enhanced_freeze = self.enhanced_freeze_checkbox.GetValue() def Reset(self): self.mute_checkbox.SetValue(True) @@ -80,7 +152,45 @@ def Reset(self): self.click_hide_checkbox.SetValue(False) self.hide_icon_checkbox.SetValue(False) self.path_match_checkbox.SetValue(False) + self.freeze_checkbox.SetValue(False) + self.enhanced_freeze_checkbox.SetValue(False) def OnSendBeforeHide(self, e): if self.send_pause_checkbox.GetValue(): - wx.MessageDialog(None, "隐藏窗口前向被隐藏的窗口发送空格,用于暂停视频等。启用此功能可能会延迟窗口的隐藏", "Boss Key", wx.OK | wx.ICON_INFORMATION).ShowModal() \ No newline at end of file + wx.MessageDialog(None, "隐藏窗口前向被隐藏的窗口发送空格,用于暂停视频等。启用此功能可能会延迟窗口的隐藏", "Boss Key", wx.OK | wx.ICON_INFORMATION).ShowModal() + + def OnFreezeAfterHide(self, e): + if self.freeze_checkbox.GetValue(): + wx.MessageDialog(None, "隐藏窗口时将冻结进程,可以减少CPU占用但某些程序可能会出现异常。\n恢复窗口时会自动解冻进程。", "Boss Key", wx.OK | wx.ICON_INFORMATION).ShowModal() + + def OnEnhancedFreeze(self, e): + if self.enhanced_freeze_checkbox.GetValue(): + # 检查pssuspend64是否存在 + if not check_pssuspend_exists(): + dlg = wx.MessageDialog(self, + "未检测到pssuspend64.exe文件!\n请先下载并放置到程序根目录,然后重新启用此选项。\n\n您可以从以下链接下载:\nhttps://download.sysinternals.com/files/PSTools.zip", + "无法启用增强冻结", wx.OK | wx.ICON_ERROR) + dlg.SetOKLabel("确定") + dlg.SetOKCancelLabels("确定", "下载") + result = dlg.ShowModal() + if result == wx.ID_CANCEL: + webbrowser.open("https://download.sysinternals.com/files/PSTools.zip") + dlg.Destroy() + self.enhanced_freeze_checkbox.SetValue(False) + return + + # 检查管理员权限 + if not is_admin(): + result = wx.MessageDialog(None, "增强冻结功能需要管理员权限才能使用!\n是否以管理员身份重启程序?", + "权限不足", wx.YES_NO | wx.ICON_WARNING).ShowModal() + self.enhanced_freeze_checkbox.SetValue(False) + + if result == wx.ID_YES: + run_as_admin() + wx.GetApp().GetTopWindow().Close() + return + + wx.MessageDialog(None, "增强冻结功能将使用Microsoft提供的pssuspend64工具,提供更稳定的进程冻结效果。\n此功能需要启用\"隐藏窗口时冻结进程\"选项才会生效。", + "增强冻结已启用", wx.OK | wx.ICON_INFORMATION).ShowModal() + # 自动勾选冻结进程选项 + self.freeze_checkbox.SetValue(True) \ No newline at end of file diff --git a/main/GUI/window_restore.py b/main/GUI/window_restore.py index 2e764d0..b7c4008 100644 --- a/main/GUI/window_restore.py +++ b/main/GUI/window_restore.py @@ -2,10 +2,12 @@ import wx.dataview as dataview import win32gui import win32con +import webbrowser from core import tools as tool from core.model import WindowInfo from core.config import Config from GUI.setting.binding_page import BindingPage +from core.tools import check_pssuspend_exists, is_admin, run_as_admin class WindowRestorePanel(BindingPage): """继承BindingPage实现窗口恢复的面板""" @@ -22,26 +24,64 @@ def init_UI(self): self.left_treelist.AppendColumn('窗口句柄', width=100) self.left_treelist.AppendColumn('进程PID', width=150) - # 按钮区域 - btn_sizer = wx.BoxSizer(wx.HORIZONTAL) + # 第一行按钮区域: 显示窗口,隐藏窗口,刷新窗口 + btn_sizer1 = wx.BoxSizer(wx.HORIZONTAL) self.show_btn = wx.Button(self, label="显示窗口") self.hide_btn = wx.Button(self, label="隐藏窗口") - btn_sizer.Add(self.show_btn, proportion=1, flag=wx.RIGHT, border=5) - btn_sizer.Add(self.hide_btn, proportion=1, flag=wx.LEFT, border=5) + self.refresh_btn = wx.Button(self, label="刷新窗口") + + btn_sizer1.Add(self.show_btn, proportion=1, flag=wx.RIGHT, border=5) + btn_sizer1.Add(self.hide_btn, proportion=1, flag=wx.LEFT|wx.RIGHT, border=5) + btn_sizer1.Add(self.refresh_btn, proportion=1, flag=wx.LEFT, border=5) + + # 第二行按钮区域: 冻结进程,解冻进程 + btn_sizer2 = wx.BoxSizer(wx.HORIZONTAL) + self.hide_freeze_btn = wx.Button(self, label="冻结进程") + self.resume_btn = wx.Button(self, label="解冻进程") + + btn_sizer2.Add(self.hide_freeze_btn, proportion=1, flag=wx.RIGHT, border=5) + btn_sizer2.Add(self.resume_btn, proportion=1, flag=wx.LEFT, border=5) # 布局 main_sizer.Add(self.left_treelist, proportion=1, flag=wx.EXPAND|wx.LEFT|wx.RIGHT, border=5) - main_sizer.Add(btn_sizer, flag=wx.EXPAND|wx.ALL, border=10) + main_sizer.Add(btn_sizer1, flag=wx.EXPAND|wx.ALL, border=10) + main_sizer.Add(btn_sizer2, flag=wx.EXPAND|wx.LEFT|wx.RIGHT|wx.BOTTOM, border=10) self.SetSizer(main_sizer) def Bind_EVT(self): self.show_btn.Bind(wx.EVT_BUTTON, self.on_show_window) self.hide_btn.Bind(wx.EVT_BUTTON, self.on_hide_window) + self.refresh_btn.Bind(wx.EVT_BUTTON, self.on_refresh_window) self.left_treelist.Bind(dataview.EVT_TREELIST_ITEM_CHECKED, self.OnToggleCheck) + self.hide_freeze_btn.Bind(wx.EVT_BUTTON, self.on_hide_freeze_window) + self.resume_btn.Bind(wx.EVT_BUTTON, self.on_resume_process) def SetData(self): self.RefreshLeftList() + + # 检查 pssuspend64 是否存在和管理员权限 + admin_status = is_admin() + has_pssuspend = check_pssuspend_exists() + + if not has_pssuspend: + self.hide_freeze_btn.SetToolTip(wx.ToolTip("需要 pssuspend64.exe 才能使用此功能")) + self.resume_btn.SetToolTip(wx.ToolTip("需要 pssuspend64.exe 才能使用此功能")) + elif not admin_status: + self.hide_freeze_btn.SetToolTip(wx.ToolTip("需要管理员权限才能使用此功能")) + self.resume_btn.SetToolTip(wx.ToolTip("需要管理员权限才能使用此功能")) + else: + self.hide_freeze_btn.Enable() + self.resume_btn.Enable() + + # 如果没有管理员权限,添加请求管理员权限按钮 + if not admin_status: + admin_button_sizer = wx.BoxSizer(wx.HORIZONTAL) + self.admin_btn = wx.Button(self, label="获取管理员权限") + self.admin_btn.Bind(wx.EVT_BUTTON, self.on_request_admin) + admin_button_sizer.Add(self.admin_btn, proportion=1, flag=wx.ALL, border=5) + self.GetSizer().Add(admin_button_sizer, flag=wx.EXPAND|wx.LEFT|wx.RIGHT|wx.BOTTOM, border=10) + self.Layout() def RefreshLeftList(self, e=None): windows = tool.getAllWindows() @@ -50,8 +90,16 @@ def RefreshLeftList(self, e=None): list.append(window) self.InsertTreeList(list, self.left_treelist, True) + def on_refresh_window(self, e=None): + """刷新窗口列表""" + self.RefreshLeftList() + def on_show_window(self, e=None): windows = self.ItemsData(self.left_treelist, only_checked=True) + if not windows: + wx.MessageBox("请先选择要显示的窗口", "提示", wx.OK | wx.ICON_INFORMATION) + return + result = wx.MessageBox(f"将恢复{len(windows)}个窗口\r\n恢复未知的窗口可能会导致窗口出错", "警告", wx.OK | wx.CANCEL | wx.ICON_WARNING) if result != wx.OK: return @@ -60,11 +108,95 @@ def on_show_window(self, e=None): def on_hide_window(self, e=None): windows = self.ItemsData(self.left_treelist, only_checked=True) + if not windows: + wx.MessageBox("请先选择要隐藏的窗口", "提示", wx.OK | wx.ICON_INFORMATION) + return + result = wx.MessageBox(f"将隐藏{len(windows)}个窗口\r\n隐藏未知的窗口可能会导致窗口出错", "警告", wx.OK | wx.CANCEL | wx.ICON_WARNING) if result != wx.OK: return for window in windows: win32gui.ShowWindow(window.hwnd, win32con.SW_HIDE) + + def on_hide_freeze_window(self, e=None): + # 检查 pssuspend64 是否存在 + if not check_pssuspend_exists(): + dlg = wx.MessageDialog(self, + "未检测到pssuspend64.exe文件!\n请先下载并放置到程序根目录,然后重试。\n\n您可以从以下链接下载:\nhttps://download.sysinternals.com/files/PSTools.zip", + "无法冻结进程", wx.OK | wx.ICON_ERROR) + dlg.SetOKLabel("确定") + dlg.SetOKCancelLabels("确定", "下载") + result = dlg.ShowModal() + if result == wx.ID_CANCEL: + webbrowser.open("https://download.sysinternals.com/files/PSTools.zip") + dlg.Destroy() + return + + # 检查管理员权限 + if not is_admin(): + wx.MessageBox("此功能需要管理员权限才能使用!\n请点击\"获取管理员权限\"按钮重启程序。", + "权限不足", wx.OK | wx.ICON_ERROR) + return + + windows = self.ItemsData(self.left_treelist, only_checked=True) + if not windows: + wx.MessageBox("请先选择要冻结的窗口进程", "提示", wx.OK | wx.ICON_INFORMATION) + return + + result = wx.MessageBox(f"将冻结{len(windows)}个进程\n冻结未知的进程可能会导致系统不稳定", "警告", + wx.OK | wx.CANCEL | wx.ICON_WARNING) + if result != wx.OK: + return + + for window in windows: + try: + if hasattr(window, 'PID') and window.PID: + tool.suspend_process_enhanced(window.PID) + except Exception as e: + wx.MessageBox(f"冻结失败: {str(e)}", "错误", wx.OK | wx.ICON_ERROR) + + def on_resume_process(self, e=None): + # 检查 pssuspend64 是否存在 + if not check_pssuspend_exists(): + dlg = wx.MessageDialog(self, + "未检测到pssuspend64.exe文件!\n请先下载并放置到程序根目录,然后重试。\n\n您可以从以下链接下载:\nhttps://download.sysinternals.com/files/PSTools.zip", + "无法解冻进程", wx.OK | wx.ICON_ERROR) + dlg.SetOKLabel("确定") + dlg.SetOKCancelLabels("确定", "下载") + result = dlg.ShowModal() + if result == wx.ID_CANCEL: + webbrowser.open("https://download.sysinternals.com/files/PSTools.zip") + dlg.Destroy() + return + + # 检查管理员权限 + if not is_admin(): + wx.MessageBox("此功能需要管理员权限才能使用!\n请点击\"获取管理员权限\"按钮重启程序。", + "权限不足", wx.OK | wx.ICON_ERROR) + return + + windows = self.ItemsData(self.left_treelist, only_checked=True) + if not windows: + wx.MessageBox("请先选择要解冻的窗口进程", "提示", wx.OK | wx.ICON_INFORMATION) + return + + result = wx.MessageBox(f"将解冻{len(windows)}个进程", "确认", wx.OK | wx.CANCEL | wx.ICON_QUESTION) + if result != wx.OK: + return + + for window in windows: + try: + if hasattr(window, 'PID') and window.PID: + tool.resume_process_enhanced(window.PID) + except Exception as e: + wx.MessageBox(f"解冻失败: {str(e)}", "错误", wx.OK | wx.ICON_ERROR) + + def on_request_admin(self, e=None): + """请求管理员权限""" + wx.MessageBox("程序将重启并请求管理员权限", "提示", wx.OK | wx.ICON_INFORMATION) + run_as_admin() + wx.GetApp().GetTopWindow().Close() + wx.GetApp().ExitMainLoop() class WindowRestoreDialog(wx.Frame): diff --git a/main/core/config.py b/main/core/config.py index ad40c73..64b3f64 100644 --- a/main/core/config.py +++ b/main/core/config.py @@ -38,6 +38,7 @@ class Config: """ history=[] + frozen_pids=[] # 存储已冻结的进程PID times=1 hide_hotkey = "Ctrl+Q" @@ -45,7 +46,9 @@ class Config: mute_after_hide = True send_before_hide = False - hide_current=True + hide_current = True + freeze_after_hide = False # 新增配置项:隐藏后冻结进程 + enhanced_freeze = False # 新增配置项:使用增强冻结(pssuspend64) click_to_hide = True hide_icon_after_hide = False @@ -83,12 +86,15 @@ def load(): config = {} # 避免出现配置文件损坏导致程序无法启动 Config.history = config.get("history", []) + Config.frozen_pids = config.get("frozen_pids", []) Config.mute_after_hide = config.get("setting", {}).get("mute_after_hide", True) Config.send_before_hide = config.get("setting", {}).get("send_before_hide", False) Config.hide_current = config.get("setting", {}).get("hide_current", True) Config.hide_icon_after_hide = config.get("setting", {}).get("hide_icon_after_hide", False) 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.click_to_hide= config.get("setting", {}).get("click_to_hide", True) @@ -107,6 +113,7 @@ def save(): config = { 'version': Config.AppVersion, 'history': Config.history, + 'frozen_pids': Config.frozen_pids, 'hotkey': { 'hide_hotkey': Config.hide_hotkey, 'close_hotkey': Config.close_hotkey @@ -117,7 +124,9 @@ def save(): 'hide_current': Config.hide_current, 'click_to_hide': Config.click_to_hide, 'hide_icon_after_hide': Config.hide_icon_after_hide, - 'path_match': Config.path_match + 'path_match': Config.path_match, + 'freeze_after_hide': Config.freeze_after_hide, # 保存新配置项 + 'enhanced_freeze': Config.enhanced_freeze # 保存新配置项 }, # 将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 1a40a21..31c3c11 100644 --- a/main/core/listener.py +++ b/main/core/listener.py @@ -2,6 +2,7 @@ import core.tools as tool from win32gui import GetForegroundWindow, ShowWindow from win32con import SW_HIDE, SW_SHOW +import win32process import sys from pynput import keyboard import multiprocessing @@ -37,9 +38,10 @@ def listenToQueue(self): tool.sendNotify("Boss Key已停止服务", "Boss Key已成功退出") self._stop() try: - wx.FindWindowById(Config.SettingWindowId).Destroy() - Config.TaskBarIcon.Destroy() - wx.FindWindowById(Config.UpdateWindowId).Destroy() + wx.GetApp().ExitMainLoop() + # wx.FindWindowById(Config.SettingWindowId).Destroy() + # wx.FindWindowById(Config.UpdateWindowId).Destroy() + # Config.TaskBarIcon.Destroy() except Exception as e: print(e) pass @@ -92,6 +94,16 @@ def ShowWindows(self,load=True): # 显示窗口 if load: Config.load() + + # 如果有冻结的进程,先解冻 + if Config.freeze_after_hide and Config.frozen_pids: + for pid in Config.frozen_pids: + try: + tool.resume_process(pid) + except Exception as e: + print(f"解冻进程失败: {e}") + Config.frozen_pids = [] + for i in Config.history: ShowWindow(i, SW_SHOW) if Config.mute_after_hide: @@ -108,6 +120,7 @@ def HideWindows(self): Config.load() needHide=[] + frozen_pids=[] windows=tool.getAllWindows() outer=windows @@ -123,14 +136,28 @@ def HideWindows(self): if tool.isSameWindow(i, j, False, not Config.path_match): 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) else: needHide.append(i.hwnd) + if Config.freeze_after_hide and hasattr(i, 'PID') and i.PID: + frozen_pids.append(i.PID) break if Config.hide_current: # 插入当前窗口的句柄 - needHide.append(GetForegroundWindow()) + hwnd = GetForegroundWindow() + needHide.append(hwnd) + # 如果需要冻结进程,获取当前窗口的PID + if Config.freeze_after_hide: + try: + pid = win32process.GetWindowThreadProcessId(hwnd)[1] + frozen_pids.append(pid) + except: + pass 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: time.sleep(0.2) @@ -139,6 +166,15 @@ def HideWindows(self): ShowWindow(i, SW_HIDE) if Config.mute_after_hide: tool.changeMute(i,1) + + # 冻结进程 + if Config.freeze_after_hide and frozen_pids: + for pid in frozen_pids: + try: + tool.suspend_process(pid) + except Exception as e: + print(f"冻结进程失败: {e}") + Config.frozen_pids = frozen_pids Config.history=needHide Config.times = 0 diff --git a/main/core/tools.py b/main/core/tools.py index 199b278..d6cea5f 100644 --- a/main/core/tools.py +++ b/main/core/tools.py @@ -9,9 +9,108 @@ import requests import json import pythoncom +import ctypes +import os +import subprocess +from ctypes import wintypes +import sys from core.model import WindowInfo +# 定义 NtSuspendProcess 和 NtResumeProcess 的类型 +NtSuspendProcess = ctypes.WINFUNCTYPE(wintypes.LONG, wintypes.HANDLE) +NtResumeProcess = ctypes.WINFUNCTYPE(wintypes.LONG, wintypes.HANDLE) + +# 加载 ntdll.dll +ntdll = ctypes.WinDLL("ntdll") +nt_suspend_process = NtSuspendProcess(("NtSuspendProcess", ntdll)) +nt_resume_process = NtResumeProcess(("NtResumeProcess", ntdll)) + +def is_admin(): + try: + return ctypes.windll.shell32.IsUserAnAdmin() + except: + return False + +def run_as_admin(): + if is_admin(): + print("Already running as administrator.") + else: + print("Requesting administrator privileges...") + ctypes.windll.shell32.ShellExecuteW(None, "runas", sys.executable, " ".join(sys.argv), None, 1) + +# 检查pssuspend64是否存在 +def check_pssuspend_exists(): + """检查pssuspend64.exe是否在程序根目录下存在""" + pssuspend_path =os.path.join(os.path.dirname(sys.argv[0]),"pssuspend64.exe") + return os.path.exists(pssuspend_path) + +# 使用pssuspend64冻结进程 +def suspend_process_enhanced(pid): + """使用pssuspend64.exe冻结指定PID的进程""" + try: + pssuspend_path = os.path.join(os.path.dirname(sys.argv[0]),"pssuspend64.exe") + result = subprocess.run([pssuspend_path, str(pid)], + stdout=subprocess.PIPE, + stderr=subprocess.PIPE, + text=True, + creationflags=subprocess.CREATE_NO_WINDOW) + if result.returncode != 0: + raise RuntimeError(f"pssuspend64执行失败: {result.stderr}") + except Exception as e: + raise RuntimeError(f"无法使用pssuspend64冻结进程: {str(e)}") + +# 使用pssuspend64解冻进程 +def resume_process_enhanced(pid): + """使用pssuspend64.exe解冻指定PID的进程""" + try: + pssuspend_path = os.path.join(os.path.dirname(sys.argv[0]),"pssuspend64.exe") + result = subprocess.run([pssuspend_path, "-r", str(pid)], + stdout=subprocess.PIPE, + stderr=subprocess.PIPE, + text=True, + creationflags=subprocess.CREATE_NO_WINDOW) + if result.returncode != 0: + raise RuntimeError(f"pssuspend64执行失败: {result.stderr}") + except Exception as e: + raise RuntimeError(f"无法使用pssuspend64解冻进程: {str(e)}") + +# 冻结进程 (Suspend Process) +def suspend_process(pid): + """冻结指定PID的进程""" + # 如果启用了增强冻结且pssuspend64存在,则使用pssuspend64 + if hasattr(Config, 'enhanced_freeze') and Config.enhanced_freeze and check_pssuspend_exists(): + return suspend_process_enhanced(pid) + + process_handle = ctypes.windll.kernel32.OpenProcess(0x001F0FFF, False, pid) # PROCESS_ALL_ACCESS + if not process_handle: + raise RuntimeError(f"无法打开进程,PID: {pid}") + + try: + nt_status = nt_suspend_process(process_handle) + if nt_status != 0: + raise RuntimeError(f"NtSuspendProcess 调用失败,状态码: {nt_status}") + finally: + ctypes.windll.kernel32.CloseHandle(process_handle) + +# 解冻进程 (Resume Process) +def resume_process(pid): + """解冻指定PID的进程""" + # 如果启用了增强冻结且pssuspend64存在,则使用pssuspend64 + if hasattr(Config, 'enhanced_freeze') and Config.enhanced_freeze and check_pssuspend_exists(): + return resume_process_enhanced(pid) + + process_handle = ctypes.windll.kernel32.OpenProcess(0x001F0FFF, False, pid) # PROCESS_ALL_ACCESS + if not process_handle: + raise RuntimeError(f"无法打开进程,PID: {pid}") + + try: + nt_status = nt_resume_process(process_handle) + if nt_status != 0: + raise RuntimeError(f"NtResumeProcess 调用失败,状态码: {nt_status}") + finally: + ctypes.windll.kernel32.CloseHandle(process_handle) + def checkUpdate(): requests.packages.urllib3.disable_warnings() # 获取最新版本信息 From 712cacfa482728f6d8c0984373eb6cf7f5daea77 Mon Sep 17 00:00:00 2001 From: Ivan Hanloth Date: Sun, 20 Apr 2025 21:50:25 +0800 Subject: [PATCH 03/18] =?UTF-8?q?=E4=BC=98=E5=8C=96=E7=AA=97=E5=8F=A3?= =?UTF-8?q?=E5=86=BB=E7=BB=93=E5=B7=A5=E5=85=B7?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- main/Boss-Key.py | 2 +- main/GUI/setting/hotkeys_page.py | 1 - main/GUI/setting/options_page.py | 82 +++++++++++++++++++++++++++++--- main/core/config.py | 6 ++- main/core/listener.py | 6 ++- main/core/tools.py | 10 ++-- 6 files changed, 90 insertions(+), 17 deletions(-) diff --git a/main/Boss-Key.py b/main/Boss-Key.py index 1aefa9c..068ea54 100644 --- a/main/Boss-Key.py +++ b/main/Boss-Key.py @@ -44,7 +44,7 @@ def clean(): self.SetAppDisplayName(Config.AppName) self.SetVendorName(Config.AppAuthor) - lock=os.path.join(os.path.dirname(sys.argv[0]),"Boss-Key.lock") + lock=os.path.join(Config.root_path,"Boss-Key.lock") if self.is_already_running(lock): ask=wx.MessageBox("Boss Key 可能已在运行\n点击“确定”继续运行新的Boss-Key程序\n点击“取消”直接关闭此窗口","Boss Key", wx.OK | wx.ICON_INFORMATION | wx.CANCEL | wx.CANCEL_DEFAULT) if ask==wx.OK: diff --git a/main/GUI/setting/hotkeys_page.py b/main/GUI/setting/hotkeys_page.py index b3cd07f..a7e2998 100644 --- a/main/GUI/setting/hotkeys_page.py +++ b/main/GUI/setting/hotkeys_page.py @@ -35,7 +35,6 @@ def init_UI(self): sizer.Add(grid_sizer, 0, wx.EXPAND | wx.ALL, 10) - self.SetSizer(sizer) def Bind_EVT(self): diff --git a/main/GUI/setting/options_page.py b/main/GUI/setting/options_page.py index b9b0d19..72ce557 100644 --- a/main/GUI/setting/options_page.py +++ b/main/GUI/setting/options_page.py @@ -15,6 +15,10 @@ def init_UI(self): sizer = wx.BoxSizer(wx.VERTICAL) # 创建网格布局 + # 创建一个StaticBox用于包含常规选项 + general_box = wx.StaticBox(self, label="常规选项") + general_box_sizer = wx.StaticBoxSizer(general_box, wx.VERTICAL) + grid_sizer = wx.GridSizer(rows=3, cols=2, gap=(10, 20)) # 减少行数为3,冻结选项将单独放置 # 添加复选框 @@ -54,7 +58,8 @@ def init_UI(self): path_sizer.Add(info_bitmap) grid_sizer.Add(path_sizer, 0, wx.ALL, 10) - sizer.Add(grid_sizer, 0, wx.EXPAND | wx.ALL, 20) + general_box_sizer.Add(grid_sizer, 0, wx.EXPAND | wx.ALL, 10) + sizer.Add(general_box_sizer, 0, wx.EXPAND | wx.ALL, 20) # 创建一个StaticBox用于包含冻结相关的选项 freeze_box = wx.StaticBox(self, label="进程冻结选项") @@ -78,7 +83,7 @@ def init_UI(self): # 8. 增强冻结(使用pssuspend64) enhanced_freeze_sizer = wx.BoxSizer(wx.HORIZONTAL) - self.enhanced_freeze_checkbox = wx.CheckBox(self, label="使用增强冻结(需要pssuspend64.exe)") + self.enhanced_freeze_checkbox = wx.CheckBox(self, label="使用增强冻结(需要pssuspend64.exe与管理员权限)") enhanced_freeze_tooltip = "使用Microsoft的pssuspend64工具执行进程冻结操作,提供更稳定的冻结效果\n需要在程序根目录放置pssuspend64.exe文件并使用管理员身份启动BossKey" self.enhanced_freeze_checkbox.SetToolTip(wx.ToolTip(enhanced_freeze_tooltip)) enhanced_freeze_info_icon = wx.ArtProvider.GetBitmap(wx.ART_INFORMATION, wx.ART_OTHER, self.FromDIP((14, 14))) @@ -91,10 +96,27 @@ def init_UI(self): freeze_box_sizer.Add(freeze_grid, 0, wx.ALL | wx.EXPAND, 5) - # 添加一个下载链接 - self.download_link = wx.adv.HyperlinkCtrl(self, -1, "下载 pssuspend64", - "https://download.sysinternals.com/files/PSTools.zip") - freeze_box_sizer.Add(self.download_link, 0, wx.ALL, 10) + # 添加下载链接和功能按钮 + link_buttons_sizer = wx.BoxSizer(wx.HORIZONTAL) + + # 下载链接 + self.download_link = wx.adv.HyperlinkCtrl(self, -1, "下载 pssuspend64", "https://download.sysinternals.com/files/PSTools.zip") + link_buttons_sizer.Add(self.download_link, 0, wx.ALIGN_CENTER_VERTICAL, 0) + + # 添加空白间距 + link_buttons_sizer.AddSpacer(20) + + # 重新检测按钮 + self.redetect_btn = wx.Button(self, label="重新检测", size=(-1, -1)) + link_buttons_sizer.Add(self.redetect_btn, 0, wx.ALIGN_CENTER_VERTICAL, 0) + + # 管理员权限按钮 + if not is_admin(): + link_buttons_sizer.AddSpacer(10) + self.admin_btn = wx.Button(self, label="以管理员身份启动", size=(-1, -1)) + link_buttons_sizer.Add(self.admin_btn, 0, wx.ALIGN_CENTER_VERTICAL, 0) + + freeze_box_sizer.Add(link_buttons_sizer, 0, wx.ALL, 10) sizer.Add(freeze_box_sizer, 0, wx.EXPAND | wx.ALL, 20) @@ -105,6 +127,11 @@ def Bind_EVT(self): self.freeze_checkbox.Bind(wx.EVT_CHECKBOX, self.OnFreezeAfterHide) self.enhanced_freeze_checkbox.Bind(wx.EVT_CHECKBOX, self.OnEnhancedFreeze) + # 绑定新按钮事件 + self.redetect_btn.Bind(wx.EVT_BUTTON, self.OnRedetectPssuspend) + if not is_admin(): + self.admin_btn.Bind(wx.EVT_BUTTON, self.OnRequestAdmin) + def SetData(self): self.mute_checkbox.SetValue(Config.mute_after_hide) self.send_pause_checkbox.SetValue(Config.send_before_hide) @@ -193,4 +220,45 @@ def OnEnhancedFreeze(self, e): wx.MessageDialog(None, "增强冻结功能将使用Microsoft提供的pssuspend64工具,提供更稳定的进程冻结效果。\n此功能需要启用\"隐藏窗口时冻结进程\"选项才会生效。", "增强冻结已启用", wx.OK | wx.ICON_INFORMATION).ShowModal() # 自动勾选冻结进程选项 - self.freeze_checkbox.SetValue(True) \ No newline at end of file + self.freeze_checkbox.SetValue(True) + + def OnRequestAdmin(self, e=None): + """请求管理员权限并重启程序""" + wx.MessageBox("程序将重启并请求管理员权限", "提示", wx.OK | wx.ICON_INFORMATION) + run_as_admin() + wx.GetApp().GetTopWindow().Close() + + def OnRedetectPssuspend(self, e=None): + """重新检测pssuspend64.exe是否存在""" + has_pssuspend = check_pssuspend_exists() + admin_status = is_admin() + + if has_pssuspend and admin_status: + self.enhanced_freeze_checkbox.Enable(True) + self.enhanced_freeze_checkbox.SetToolTip(wx.ToolTip("使用Microsoft的pssuspend64工具执行进程冻结操作,提供更稳定的冻结效果")) + wx.MessageBox("检测到pssuspend64.exe文件,增强冻结功能已启用!", "检测成功", wx.OK | wx.ICON_INFORMATION) + elif not has_pssuspend: + self.enhanced_freeze_checkbox.SetValue(False) + self.enhanced_freeze_checkbox.Enable(False) + self.enhanced_freeze_checkbox.SetToolTip(wx.ToolTip("需要pssuspend64.exe才能启用此功能")) + + dlg = wx.MessageDialog(self, + "未检测到pssuspend64.exe文件!\n请先下载并放置到程序根目录,然后重新检测。\n\n您可以从以下链接下载:\nhttps://download.sysinternals.com/files/PSTools.zip", + "检测失败", wx.OK | wx.ICON_ERROR) + dlg.SetOKLabel("确定") + dlg.SetOKCancelLabels("确定", "下载") + result = dlg.ShowModal() + if result == wx.ID_CANCEL: + webbrowser.open("https://download.sysinternals.com/files/PSTools.zip") + dlg.Destroy() + elif not admin_status: + self.enhanced_freeze_checkbox.SetValue(False) + self.enhanced_freeze_checkbox.Enable(False) + self.enhanced_freeze_checkbox.SetToolTip(wx.ToolTip("需要管理员权限才能启用此功能")) + + result = wx.MessageDialog(None, "检测到pssuspend64.exe文件,但增强冻结功能需要管理员权限才能使用!\n是否以管理员身份重启程序?", + "权限不足", wx.YES_NO | wx.ICON_WARNING).ShowModal() + + if result == wx.ID_YES: + run_as_admin() + wx.GetApp().ExitMainLoop() \ No newline at end of file diff --git a/main/core/config.py b/main/core/config.py index 64b3f64..dcf73ff 100644 --- a/main/core/config.py +++ b/main/core/config.py @@ -56,9 +56,11 @@ class Config: hide_binding = [] - config_path = os.path.join(os.getcwd(), "config.json") - icon=BytesIO(get_icon()) + root_path = os.path.dirname(sys.argv[0]) + config_path = os.path.join(root_path, "config.json") file_path=sys.argv[0] + + icon=BytesIO(get_icon()) # 判断是否为首次启动 first_start = not os.path.exists(config_path) diff --git a/main/core/listener.py b/main/core/listener.py index 31c3c11..559d542 100644 --- a/main/core/listener.py +++ b/main/core/listener.py @@ -8,6 +8,7 @@ import multiprocessing import threading import time +import os import wx class HotkeyListener(): @@ -117,7 +118,7 @@ def ShowWindows(self,load=True): def HideWindows(self): # 隐藏窗口 - + Config.load() needHide=[] frozen_pids=[] @@ -151,6 +152,9 @@ def HideWindows(self): if Config.freeze_after_hide: try: pid = win32process.GetWindowThreadProcessId(hwnd)[1] + current_pid = win32process.GetCurrentProcessId() # 获取当前程序的PID + if pid != current_pid and pid !=os.getpid(): # 如果当前窗口的pid与本程序的pid相同,则不冻结 + frozen_pids.append(pid) frozen_pids.append(pid) except: pass diff --git a/main/core/tools.py b/main/core/tools.py index d6cea5f..d7f58a0 100644 --- a/main/core/tools.py +++ b/main/core/tools.py @@ -42,14 +42,14 @@ def run_as_admin(): # 检查pssuspend64是否存在 def check_pssuspend_exists(): """检查pssuspend64.exe是否在程序根目录下存在""" - pssuspend_path =os.path.join(os.path.dirname(sys.argv[0]),"pssuspend64.exe") + pssuspend_path =os.path.join(Config.root_path,"pssuspend64.exe") return os.path.exists(pssuspend_path) # 使用pssuspend64冻结进程 def suspend_process_enhanced(pid): """使用pssuspend64.exe冻结指定PID的进程""" try: - pssuspend_path = os.path.join(os.path.dirname(sys.argv[0]),"pssuspend64.exe") + pssuspend_path = os.path.join(Config.root_path,"pssuspend64.exe") result = subprocess.run([pssuspend_path, str(pid)], stdout=subprocess.PIPE, stderr=subprocess.PIPE, @@ -64,7 +64,7 @@ def suspend_process_enhanced(pid): def resume_process_enhanced(pid): """使用pssuspend64.exe解冻指定PID的进程""" try: - pssuspend_path = os.path.join(os.path.dirname(sys.argv[0]),"pssuspend64.exe") + pssuspend_path = os.path.join(Config.root_path,"pssuspend64.exe") result = subprocess.run([pssuspend_path, "-r", str(pid)], stdout=subprocess.PIPE, stderr=subprocess.PIPE, @@ -79,7 +79,7 @@ def resume_process_enhanced(pid): def suspend_process(pid): """冻结指定PID的进程""" # 如果启用了增强冻结且pssuspend64存在,则使用pssuspend64 - if hasattr(Config, 'enhanced_freeze') and Config.enhanced_freeze and check_pssuspend_exists(): + if hasattr(Config, 'enhanced_freeze') and Config.enhanced_freeze and check_pssuspend_exists() and is_admin(): return suspend_process_enhanced(pid) process_handle = ctypes.windll.kernel32.OpenProcess(0x001F0FFF, False, pid) # PROCESS_ALL_ACCESS @@ -97,7 +97,7 @@ def suspend_process(pid): def resume_process(pid): """解冻指定PID的进程""" # 如果启用了增强冻结且pssuspend64存在,则使用pssuspend64 - if hasattr(Config, 'enhanced_freeze') and Config.enhanced_freeze and check_pssuspend_exists(): + if hasattr(Config, 'enhanced_freeze') and Config.enhanced_freeze and check_pssuspend_exists() and is_admin(): return resume_process_enhanced(pid) process_handle = ctypes.windll.kernel32.OpenProcess(0x001F0FFF, False, pid) # PROCESS_ALL_ACCESS From df982e71c8ee1cf3eab5274fd01c0b0e831f04e9 Mon Sep 17 00:00:00 2001 From: Ivan Hanloth Date: Sun, 20 Apr 2025 21:54:52 +0800 Subject: [PATCH 04/18] =?UTF-8?q?=E4=BF=AE=E5=A4=8D=E5=8F=AF=E8=83=BD?= =?UTF-8?q?=E5=86=BB=E7=BB=93=E5=BD=93=E5=89=8D=E8=BF=9B=E7=A8=8B=E7=9A=84?= =?UTF-8?q?=E9=97=AE=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- main/core/listener.py | 1 - 1 file changed, 1 deletion(-) diff --git a/main/core/listener.py b/main/core/listener.py index 559d542..0358aa3 100644 --- a/main/core/listener.py +++ b/main/core/listener.py @@ -155,7 +155,6 @@ def HideWindows(self): current_pid = win32process.GetCurrentProcessId() # 获取当前程序的PID if pid != current_pid and pid !=os.getpid(): # 如果当前窗口的pid与本程序的pid相同,则不冻结 frozen_pids.append(pid) - frozen_pids.append(pid) except: pass From 30d565ee003deb5b28e147c170782728905ab51a Mon Sep 17 00:00:00 2001 From: Ivan Hanloth Date: Sun, 20 Apr 2025 21:57:25 +0800 Subject: [PATCH 05/18] =?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 06/18] =?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 07/18] =?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 08/18] =?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 09/18] =?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 10/18] =?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 11/18] =?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 12/18] =?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) From a832a792eac91ef96dec743ab18d307e0b797169 Mon Sep 17 00:00:00 2001 From: Ivan Hanloth Date: Mon, 21 Apr 2025 09:42:45 +0800 Subject: [PATCH 13/18] =?UTF-8?q?=E6=96=B0=E5=A2=9E=E9=BC=A0=E6=A0=87?= =?UTF-8?q?=E7=A7=BB=E5=8A=A8=E8=87=B3=E5=9B=9B=E8=A7=92=E9=9A=90=E8=97=8F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .gitignore | 3 +- main/GUI/setting/hotkeys_page.py | 59 ++++++++++++++++++++++-- main/core/config.py | 23 +++++++++- main/core/listener.py | 77 ++++++++++++++++++++++++++++++-- 4 files changed, 154 insertions(+), 8 deletions(-) diff --git a/.gitignore b/.gitignore index 4014716..19a55fa 100644 --- a/.gitignore +++ b/.gitignore @@ -6,4 +6,5 @@ user.ini *.lock out/ test.py -pssuspend64.exe \ No newline at end of file +pssuspend64.exe +.bosskey_state diff --git a/main/GUI/setting/hotkeys_page.py b/main/GUI/setting/hotkeys_page.py index b37c58b..a8128c6 100644 --- a/main/GUI/setting/hotkeys_page.py +++ b/main/GUI/setting/hotkeys_page.py @@ -42,6 +42,8 @@ def init_UI(self): # 添加鼠标隐藏选项 mouse_box = wx.StaticBox(self, label="鼠标隐藏") mouse_box_sizer = wx.StaticBoxSizer(mouse_box, wx.VERTICAL) + + mouse_grid_sizer = wx.GridSizer(rows=1, cols=3, gap=(10, 10)) # 中键选项 self.middle_button_checkbox = wx.CheckBox(self, label="启用鼠标中键隐藏窗口") @@ -55,9 +57,39 @@ def init_UI(self): 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) + mouse_grid_sizer.Add(self.middle_button_checkbox, 0, wx.ALL, 10) + mouse_grid_sizer.Add(self.side_button1_checkbox, 0, wx.ALL, 10) + mouse_grid_sizer.Add(self.side_button2_checkbox, 0, wx.ALL, 10) + + mouse_move_grid_sizer = wx.GridSizer(rows=2, cols=2, gap=(10, 10)) + + # 左上角 + self.top_left_checkbox = wx.CheckBox(self, label="左上角隐藏窗口") + self.top_left_checkbox.SetToolTip(wx.ToolTip("快速移动鼠标至左上角以隐藏窗口")) + mouse_move_grid_sizer.Add(self.top_left_checkbox, 0, wx.ALL, 10) + + # 右上角 + self.top_right_checkbox = wx.CheckBox(self, label="右上角隐藏窗口") + self.top_right_checkbox.SetToolTip(wx.ToolTip("快速移动鼠标至右上角以隐藏窗口")) + mouse_move_grid_sizer.Add(self.top_right_checkbox, 0, wx.ALL, 10) + + # 左下角 + self.bottom_left_checkbox = wx.CheckBox(self, label="左下角隐藏窗口") + self.bottom_left_checkbox.SetToolTip(wx.ToolTip("快速移动鼠标至左下角以隐藏窗口")) + mouse_move_grid_sizer.Add(self.bottom_left_checkbox, 0, wx.ALL, 10) + + # 右下角 + self.bottom_right_checkbox = wx.CheckBox(self, label="右下角隐藏窗口") + self.bottom_right_checkbox.SetToolTip(wx.ToolTip("快速移动鼠标至右下角以隐藏窗口")) + mouse_move_grid_sizer.Add(self.bottom_right_checkbox, 0, wx.ALL, 10) + + mouse_box_sizer.Add(mouse_grid_sizer, 0, wx.EXPAND | wx.ALL, 10) + mouse_box_sizer.Add(mouse_move_grid_sizer, 0, wx.EXPAND | wx.ALL, 10) + + # 添加允许移动恢复选项 + self.allow_move_restore_checkbox = wx.CheckBox(self, label="允许移动恢复") + self.allow_move_restore_checkbox.SetToolTip(wx.ToolTip("启用后可通过移动鼠标到同一角落恢复已隐藏的窗口")) + mouse_box_sizer.Add(self.allow_move_restore_checkbox, 0, wx.ALL, 10) sizer.Add(mouse_box_sizer, 0, wx.EXPAND | wx.ALL, 10) @@ -115,6 +147,13 @@ def SetData(self): self.auto_hide_time.SetValue(auto_hide_time) self.auto_hide_time.Enable(auto_hide_enabled) + # 设置鼠标移动至四角隐藏选项 + self.top_left_checkbox.SetValue(Config.top_left_hide if hasattr(Config, 'top_left_hide') else False) + self.top_right_checkbox.SetValue(Config.top_right_hide if hasattr(Config, 'top_right_hide') else False) + self.bottom_left_checkbox.SetValue(Config.bottom_left_hide if hasattr(Config, 'bottom_left_hide') else False) + self.bottom_right_checkbox.SetValue(Config.bottom_right_hide if hasattr(Config, 'bottom_right_hide') else False) + self.allow_move_restore_checkbox.SetValue(Config.allow_move_restore if hasattr(Config, 'allow_move_restore') else False) + def SaveData(self): Config.hide_hotkey = self.hide_show_text.GetValue() Config.close_hotkey = self.close_text.GetValue() @@ -126,6 +165,13 @@ def SaveData(self): Config.auto_hide_enabled = self.auto_hide_checkbox.GetValue() Config.auto_hide_time = self.auto_hide_time.GetValue() + # 保存鼠标移动至四角隐藏设置 + Config.top_left_hide = self.top_left_checkbox.GetValue() + Config.top_right_hide = self.top_right_checkbox.GetValue() + Config.bottom_left_hide = self.bottom_left_checkbox.GetValue() + Config.bottom_right_hide = self.bottom_right_checkbox.GetValue() + Config.allow_move_restore = self.allow_move_restore_checkbox.GetValue() + def Reset(self): self.hide_show_text.SetValue("Ctrl+Q") self.close_text.SetValue("Win+Esc") @@ -136,6 +182,13 @@ def Reset(self): self.auto_hide_time.SetValue(5) self.auto_hide_time.Enable(False) + # 重置鼠标移动至四角隐藏设置 + self.top_left_checkbox.SetValue(False) + self.top_right_checkbox.SetValue(False) + self.bottom_left_checkbox.SetValue(False) + self.bottom_right_checkbox.SetValue(False) + self.allow_move_restore_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 418c851..db39553 100644 --- a/main/core/config.py +++ b/main/core/config.py @@ -58,6 +58,13 @@ class Config: side_button2_hide = False # 鼠标侧键2隐藏功能开关 auto_hide_enabled = False # 自动隐藏功能开关 auto_hide_time = 5 # 自动隐藏等待时间(分钟) + + # 添加鼠标四角隐藏配置 + top_left_hide = False # 左上角隐藏窗口 + top_right_hide = False # 右上角隐藏窗口 + bottom_left_hide = False # 左下角隐藏窗口 + bottom_right_hide = False # 右下角隐藏窗口 + allow_move_restore = False # 允许移动恢复窗口 hide_binding = [] @@ -108,6 +115,13 @@ def load(): 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.top_left_hide = config.get("setting", {}).get("top_left_hide", False) + Config.top_right_hide = config.get("setting", {}).get("top_right_hide", False) + Config.bottom_left_hide = config.get("setting", {}).get("bottom_left_hide", False) + Config.bottom_right_hide = config.get("setting", {}).get("bottom_right_hide", False) + Config.allow_move_restore = config.get("setting", {}).get("allow_move_restore", False) + Config.click_to_hide= config.get("setting", {}).get("click_to_hide", True) Config.hide_hotkey = config.get("hotkey", {}).get("hide_hotkey", "Ctrl+Q") @@ -143,7 +157,14 @@ def save(): 'side_button1_hide': Config.side_button1_hide, # 保存鼠标侧键1隐藏设置 'side_button2_hide': Config.side_button2_hide, # 保存鼠标侧键2隐藏设置 'auto_hide_enabled': Config.auto_hide_enabled, # 保存自动隐藏功能开关 - 'auto_hide_time': Config.auto_hide_time # 保存自动隐藏等待时间 + 'auto_hide_time': Config.auto_hide_time, # 保存自动隐藏等待时间 + + # 保存鼠标四角隐藏设置 + 'top_left_hide': Config.top_left_hide, + 'top_right_hide': Config.top_right_hide, + 'bottom_left_hide': Config.bottom_left_hide, + 'bottom_right_hide': Config.bottom_right_hide, + 'allow_move_restore': Config.allow_move_restore }, # 将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 f7f58cb..9eb3c20 100644 --- a/main/core/listener.py +++ b/main/core/listener.py @@ -3,8 +3,9 @@ from win32gui import GetForegroundWindow, ShowWindow from win32con import SW_HIDE, SW_SHOW import win32process +import win32api import sys -from pynput import keyboard, mouse # 确保导入mouse模块 +from pynput import keyboard, mouse import multiprocessing import threading import time @@ -17,6 +18,7 @@ def __init__(self): self.Queue = multiprocessing.Queue() self.listener = None self.mouse_listener = None + self.mouse_move_listener = None # 鼠标移动监听器 self.keyboard_activity_listener = None self.mouse_activity_listener = None self.last_activity_time = time.time() @@ -24,7 +26,14 @@ def __init__(self): self.shared_state_file = os.path.join(Config.root_path, ".bosskey_state") self.end_flag = False - # 然后再执行可能使用这些属性的方法 + # 角落边界检测参数 + self.corner_threshold = 10 # 角落检测的阈值(像素) + self.corner_cooldown = 1.0 # 角落触发的冷却时间(秒) + self.last_corner_trigger = 0 # 上次角落触发的时间戳 + # 使用win32api获取屏幕尺寸 + self.screen_width = win32api.GetSystemMetrics(0) # SM_CXSCREEN常量为0 + self.screen_height = win32api.GetSystemMetrics(1) # SM_CYSCREEN常量为1 + try: self.ShowWindows() except: @@ -72,6 +81,13 @@ 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() + + # 如果启用了任何屏幕角落隐藏,则添加鼠标移动监听 + if (hasattr(Config, 'top_left_hide') and Config.top_left_hide) or \ + (hasattr(Config, 'top_right_hide') and Config.top_right_hide) or \ + (hasattr(Config, 'bottom_left_hide') and Config.bottom_left_hide) or \ + (hasattr(Config, 'bottom_right_hide') and Config.bottom_right_hide): + self.start_mouse_move_listener() # 启动自动隐藏监控(如果启用) self.start_auto_hide_monitor() @@ -172,6 +188,53 @@ def on_mouse_click(self, x, y, button, pressed): # 在主线程中执行onHide wx.CallAfter(self.onHide) + def start_mouse_move_listener(self): + """启动鼠标移动监听器""" + if self.mouse_move_listener is None or not self.mouse_move_listener.is_alive(): + self.mouse_move_listener = mouse.Listener(on_move=self.on_mouse_move) + self.mouse_move_listener.daemon = True + self.mouse_move_listener.start() + + def on_mouse_move(self, x, y): + """鼠标移动事件处理,检测四个角落""" + now = time.time() + # 如果冷却时间未过,则不处理 + if now - self.last_corner_trigger < self.corner_cooldown: + return + + # 获取当前窗口状态,1=显示,0=隐藏 + current_state = self.get_windows_state() + + # 检测是否在角落区域 + corner_detected = None + + # 左上角 + if x <= self.corner_threshold and y <= self.corner_threshold: + if Config.top_left_hide: + corner_detected = "top_left" + + # 右上角 + elif x >= self.screen_width - self.corner_threshold and y <= self.corner_threshold: + if Config.top_right_hide: + corner_detected = "top_right" + + # 左下角 + elif x <= self.corner_threshold and y >= self.screen_height - self.corner_threshold: + if Config.bottom_left_hide: + corner_detected = "bottom_left" + + # 右下角 + elif x >= self.screen_width - self.corner_threshold and y >= self.screen_height - self.corner_threshold: + if Config.bottom_right_hide: + corner_detected = "bottom_right" + + # 如果检测到角落并且满足条件 + if corner_detected: + # 根据当前状态和恢复设置决定是否执行操作 + if current_state == 1 or (current_state == 0 and Config.allow_move_restore): + wx.CallAfter(self.onHide) + self.last_corner_trigger = now + def ListenerProcess(self, hotkey): """键盘热键监听进程""" try: @@ -343,13 +406,21 @@ def _stop(self): 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 + + # 停止鼠标移动监听器 + if hasattr(self, 'mouse_move_listener') and self.mouse_move_listener is not None: + try: + self.mouse_move_listener.stop() + self.mouse_move_listener = None + except: + pass # 停止自动隐藏监控 self.stop_auto_hide_monitor() From 5ee3dd4e6009a00e2a637186b4e9cc0b28676d91 Mon Sep 17 00:00:00 2001 From: Ivan Hanloth Date: Mon, 21 Apr 2025 09:59:29 +0800 Subject: [PATCH 14/18] =?UTF-8?q?=E6=9B=B4=E6=96=B0=E9=83=A8=E5=88=86ui?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- main/GUI/setting/hotkeys_page.py | 5 ++++- main/GUI/setting/options_page.py | 8 +++++--- 2 files changed, 9 insertions(+), 4 deletions(-) diff --git a/main/GUI/setting/hotkeys_page.py b/main/GUI/setting/hotkeys_page.py index a8128c6..adff6d9 100644 --- a/main/GUI/setting/hotkeys_page.py +++ b/main/GUI/setting/hotkeys_page.py @@ -2,11 +2,14 @@ from core.config import Config import GUI.record as record -class HotkeysPage(wx.Panel): +import wx.lib.scrolledpanel as scrolled + +class HotkeysPage(scrolled.ScrolledPanel): def __init__(self, parent): super().__init__(parent) self.init_UI() self.Bind_EVT() + self.SetupScrolling() def init_UI(self): sizer = wx.BoxSizer(wx.VERTICAL) diff --git a/main/GUI/setting/options_page.py b/main/GUI/setting/options_page.py index a0fc3d4..ff17644 100644 --- a/main/GUI/setting/options_page.py +++ b/main/GUI/setting/options_page.py @@ -2,14 +2,16 @@ import wx.adv import webbrowser from core.config import Config +import wx.lib.scrolledpanel as scrolled import os from core.tools import check_pssuspend_exists, is_admin, run_as_admin -class OptionsPage(wx.Panel): +class OptionsPage(scrolled.ScrolledPanel): def __init__(self, parent): super().__init__(parent) self.init_UI() self.Bind_EVT() + self.SetupScrolling() def init_UI(self): sizer = wx.BoxSizer(wx.VERTICAL) @@ -59,7 +61,7 @@ def init_UI(self): grid_sizer.Add(path_sizer, 0, wx.ALL, 10) general_box_sizer.Add(grid_sizer, 0, wx.EXPAND | wx.ALL, 10) - sizer.Add(general_box_sizer, 0, wx.EXPAND | wx.ALL, 20) + sizer.Add(general_box_sizer, 0, wx.EXPAND | wx.ALL, 10) # 创建一个StaticBox用于包含冻结相关的选项 freeze_box = wx.StaticBox(self, label="进程冻结选项") @@ -118,7 +120,7 @@ def init_UI(self): freeze_box_sizer.Add(link_buttons_sizer, 0, wx.ALL, 10) - sizer.Add(freeze_box_sizer, 0, wx.EXPAND | wx.ALL, 20) + sizer.Add(freeze_box_sizer, 0, wx.EXPAND | wx.ALL, 10) self.SetSizer(sizer) From 659ca775f9d102373afbe06750a15fc6ccbd31ae Mon Sep 17 00:00:00 2001 From: Ivan Hanloth Date: Mon, 21 Apr 2025 12:09:15 +0800 Subject: [PATCH 15/18] =?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 | 41 +++++++++++++++++++++++++++++--- main/GUI/setting/options_page.py | 1 - 2 files changed, 38 insertions(+), 4 deletions(-) diff --git a/main/GUI/setting/base.py b/main/GUI/setting/base.py index c76fbab..511af48 100644 --- a/main/GUI/setting/base.py +++ b/main/GUI/setting/base.py @@ -11,6 +11,7 @@ def __init__(self, id=None): self.SetIcon(wx.Icon(wx.Image(Config.icon).ConvertToBitmap())) self.init_UI() + self.InitMenu() self.Bind_EVT() self.SetData() self.SetSize((1500, 800)) @@ -18,6 +19,7 @@ def __init__(self, id=None): def init_UI(self): panel = wx.Panel(self) + self.infobar = wx.InfoBar(panel) sizer = wx.BoxSizer(wx.VERTICAL) # 创建notebook @@ -32,6 +34,7 @@ def init_UI(self): self.notebook.AddPage(self.hotkeys_page, "热键设置") self.notebook.AddPage(self.options_page, "其他选项") + sizer.Add(self.infobar, 0, wx.EXPAND | wx.ALL, 5) sizer.Add(self.notebook, 1, wx.EXPAND | wx.ALL, 5) # 创建按钮 @@ -44,13 +47,40 @@ def init_UI(self): sizer.Add(button_sizer, 0, wx.EXPAND | wx.ALL, 10) # 设置提示 - if Config.first_start: - static_text = wx.StaticText(panel, label="本页面仅在首次启动或内容有更新时自动显示,后续可通过托盘图标打开本页面") - sizer.Add(static_text, 0, wx.EXPAND | wx.BOTTOM, 10) + if not Config.first_start: + self.infobar.ShowMessage("欢迎使用 Boss Key!本页面仅在首次启动或内容有更新时自动显示,后续可通过托盘图标打开本页面", wx.ICON_INFORMATION) panel.SetSizer(sizer) sizer.Fit(self) + def InitMenu(self): + ## 创建菜单栏 + menuBar = wx.MenuBar() + menu1 = wx.Menu() + menu1.Append(101, "检查更新") + menu1.Append(wx.ID_ABOUT, "关于程序") + menu1.AppendSeparator() + menu1.Append(wx.ID_EXIT, "退出程序") + menuBar.Append(menu1, "关于(&A)") + + menu2 = wx.Menu() + menu2.Append(201, "开机自启", kind=wx.ITEM_CHECK) + menu2.Append(202, "窗口恢复工具") + menuBar.Append(menu2, "工具(&T)") + + # menuBar.Append(300, "帮助(&H)") + + self.SetMenuBar(menuBar) + + ## 绑定菜单事件 + self.Bind(wx.EVT_MENU, Config.TaskBarIcon.onUpdate, id=101) + self.Bind(wx.EVT_MENU, Config.TaskBarIcon.onAbout, id=wx.ID_ABOUT) + self.Bind(wx.EVT_MENU, Config.TaskBarIcon.onExit, id=wx.ID_EXIT) + self.Bind(wx.EVT_MENU, Config.TaskBarIcon.onStartup, id=201) + self.Bind(wx.EVT_MENU_OPEN, self.OnUpdateStartupStatus) + self.Bind(wx.EVT_MENU, Config.TaskBarIcon.onRestore, id=202) + # self.Bind(wx.EVT_MENU, self.OnHelp, id=300) + def Bind_EVT(self): self.save_btn.Bind(wx.EVT_BUTTON, self.OnSave) self.reset_btn.Bind(wx.EVT_BUTTON, self.OnReset) @@ -86,6 +116,11 @@ def OnReset(self, e): def OnClose(self, e): self.Hide() + + def OnUpdateStartupStatus(self, e=""): + # 更新菜单项的选中状态 + print(1) + self.GetMenuBar().FindItemById(201).Check(tool.checkStartup("Boss Key Application", Config.file_path)) def RefreshLeftList(self, e=None): """刷新左侧列表,供外部调用""" diff --git a/main/GUI/setting/options_page.py b/main/GUI/setting/options_page.py index ff17644..7acc378 100644 --- a/main/GUI/setting/options_page.py +++ b/main/GUI/setting/options_page.py @@ -3,7 +3,6 @@ import webbrowser from core.config import Config import wx.lib.scrolledpanel as scrolled -import os from core.tools import check_pssuspend_exists, is_admin, run_as_admin class OptionsPage(scrolled.ScrolledPanel): From b8fa2190cfa0b27da1a1673e23b469ca0bf135a2 Mon Sep 17 00:00:00 2001 From: Ivan Hanloth Date: Mon, 21 Apr 2025 12:13:08 +0800 Subject: [PATCH 16/18] =?UTF-8?q?=E4=BD=BF=E7=94=A8=5Fstop?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- main/GUI/setting/hotkeys_page.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/main/GUI/setting/hotkeys_page.py b/main/GUI/setting/hotkeys_page.py index adff6d9..b87feee 100644 --- a/main/GUI/setting/hotkeys_page.py +++ b/main/GUI/setting/hotkeys_page.py @@ -200,7 +200,7 @@ def OnRecordClose(self, e): def recordHotkey(self, text_ctrl: wx.TextCtrl, btn: wx.Button): try: - Config.HotkeyListener.stop() + Config.HotkeyListener._stop() except: pass btn.Disable() From 89e935c20d448ce480fdc2aa0c839beb891d0c62 Mon Sep 17 00:00:00 2001 From: Ivan Hanloth Date: Mon, 21 Apr 2025 12:47:16 +0800 Subject: [PATCH 17/18] =?UTF-8?q?=E6=9B=B4=E6=96=B0v2.1.0.0=E7=89=88?= =?UTF-8?q?=E6=9C=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 41 +++++++++++++++++++++++++------ main/GUI/setting/hotkeys_page.py | 16 ++++++------ main/core/config.py | 4 +-- src/static/screenshot-1.png | Bin 57385 -> 57172 bytes src/static/screenshot-2.png | Bin 34064 -> 0 bytes src/static/screenshot-3.png | Bin 6736 -> 44630 bytes src/static/screenshot-5.png | Bin 0 -> 42913 bytes 7 files changed, 44 insertions(+), 17 deletions(-) delete mode 100644 src/static/screenshot-2.png create mode 100644 src/static/screenshot-5.png diff --git a/README.md b/README.md index 5d6ae1e..bf137e6 100644 --- a/README.md +++ b/README.md @@ -1,6 +1,6 @@ # Boss-Key -![](/src/static/bannar.jpg) +![Boss-Key logo bannar](/src/static/bannar.jpg) ![Github Release Version](https://img.shields.io/github/v/release/IvanHanloth/Boss-Key) ![Github Repo License](https://img.shields.io/github/license/IvanHanloth/Boss-Key) @@ -13,13 +13,13 @@ 支持多窗口隐藏、多进程隐藏、自定义热键、隐藏活动窗口、静音窗口、暂停视频播放等超多功能,完全免费、开源,无强制弹窗等 ## 应用截图 -![](/src/static/screenshot-1.png) +![Boss-Key设置窗口绑定页](/src/static/screenshot-1.png) -![](/src/static/screenshot-2.png) +![Boss-Key设置热键设置页](/src/static/screenshot-5.png) -![](/src/static/screenshot-3.png) +![Boss-Key设置窗口其他选项页](/src/static/screenshot-3.png) -![](/src/static/screenshot-4.png) +![Boss-Key运行提示](/src/static/screenshot-4.png) ## 使用说明 从v2.0.0版本开始,每个版本都会提供三种类型的程序,可以从[Release页面](https://github.com/IvanHanloth/Boss-Key/releases)下载 @@ -61,6 +61,11 @@ 完成所有热键修改后,**记得点击下方的“保存设置”按钮保存并启用设置** +### 鼠标隐藏 +v2.1.0版本加入了鼠标相关操作隐藏绑定,可以选择鼠标中键、侧键1、侧键2切换串口隐藏状态。 + +可以勾选快速移动鼠标至四角隐藏窗口(启用允许移动恢复功能以允许通过快速移动鼠标至四角恢复窗口) + ### 检查更新 右键点击托盘打开托盘菜单,选择“检查更新”即可打开当前检查更新窗口。 @@ -78,6 +83,7 @@ #### 文件路径匹配功能 Boss Key默认使用窗口标题等多因素进行窗口匹配以确保精确隐藏窗口,但是有时可能出现希望根据可执行文件路径来进行匹配: + 即只要是由同一个程序启动的窗口都隐藏,此时就可以启用“文件路径匹配”选项进行模糊匹配 #### 同时隐藏当前活动窗口 @@ -87,7 +93,15 @@ Boss Key默认使用窗口标题等多因素进行窗口匹配以确保精确隐 启用该功能后,可以通过单击托盘图标来显示或隐藏窗口 ### 设置和关闭开机自启 -如果需要让Boss-Key程序开机自启,可以右键点击托盘图标,在弹出的菜单中选择“开机自启”来切换开机自启状态 +如果需要让Boss-Key程序开机自启,可以右键点击托盘图标,在弹出的菜单中选择“开机自启”来切换开机自启状态,或从窗口菜单->工具->开机自启选项进行切换。 + +### 进程冻结相关功能 +自v2.1.0版本开始,Boss-Key加入了隐藏窗口后冻结进程功能。启用此功能将在隐藏窗口后将对应的进程“冻结”,减轻CPU和内存压力。 +启用此功能需要**以管理员身份运行**。冻结加强功能则额外需要下载pssuspend64.exe文件置于程序目录下以供调用。 + +**如何下载和使用加强冻结功能:** + +您需要手动访问[https://download.sysinternals.com/files/PSTools.zip](https://download.sysinternals.com/files/PSTools.zip)页面,下载由Microsoft提供的PSTools工具包。解压下载得到`PSTools.zip`文件,可以找到`pssuspend64.exe`文件,直接复制该文件,放置于Boss-Key程序的安装根目录即可。 ## 常见问题 **为什么我的电脑运行不了编译后的程序** @@ -124,7 +138,12 @@ Boss-Key │   │   ├── __init__.py 初始化包 │   │   ├── about.py 关于页面 │   │   ├── record.py 录制热键页面 -│   │   ├── setting.py 设置页面 +│   │   ├── setting 设置页面相关子类 +│   │   │  ├── __init__.py 初始化包 +│   │   │  ├── base.py 设置页面基础类 +│   │   │  ├── binding_page.py 窗口绑定页面 +│   │   │  ├── hotkeys_page.py 热键绑定页面 +│   │   │  └── options_page.py 其他选项页面 │   │   ├── taskbar.py 托盘图标 │   │   └── window_restore.py 窗口恢复工具页面 │   └── Boss-Key.py 项目入口文件 @@ -159,6 +178,14 @@ Boss-Key - 无法隐藏部分游戏窗口,可能由于游戏窗口加密导致 ## 更新日志 +**V2.1.0 (更新于2025/4/21)** +- 新增鼠标中键、侧键隐藏功能 +- 新增鼠标移动至四角隐藏功能 +- 新增进程冻结功能 +- 新增自动隐藏功能 +- 优化界面UI设计 +- 优化窗口恢复工具 + **V2.0.4 (更新于2025/4/9)** - 修复无法正确禁音应用的问题 - 优化选项提示 diff --git a/main/GUI/setting/hotkeys_page.py b/main/GUI/setting/hotkeys_page.py index adff6d9..aa43fa4 100644 --- a/main/GUI/setting/hotkeys_page.py +++ b/main/GUI/setting/hotkeys_page.py @@ -49,15 +49,15 @@ def init_UI(self): mouse_grid_sizer = wx.GridSizer(rows=1, cols=3, gap=(10, 10)) # 中键选项 - self.middle_button_checkbox = wx.CheckBox(self, label="启用鼠标中键隐藏窗口") + 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 = 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 = wx.CheckBox(self, label="启用鼠标侧键2切换隐藏") self.side_button2_checkbox.SetToolTip(wx.ToolTip("点击鼠标侧键2(后退键)可快速隐藏/显示窗口")) mouse_grid_sizer.Add(self.middle_button_checkbox, 0, wx.ALL, 10) @@ -67,22 +67,22 @@ def init_UI(self): mouse_move_grid_sizer = wx.GridSizer(rows=2, cols=2, gap=(10, 10)) # 左上角 - self.top_left_checkbox = wx.CheckBox(self, label="左上角隐藏窗口") + self.top_left_checkbox = wx.CheckBox(self, label="左上角快速隐藏") self.top_left_checkbox.SetToolTip(wx.ToolTip("快速移动鼠标至左上角以隐藏窗口")) mouse_move_grid_sizer.Add(self.top_left_checkbox, 0, wx.ALL, 10) # 右上角 - self.top_right_checkbox = wx.CheckBox(self, label="右上角隐藏窗口") + self.top_right_checkbox = wx.CheckBox(self, label="右上角快速隐藏") self.top_right_checkbox.SetToolTip(wx.ToolTip("快速移动鼠标至右上角以隐藏窗口")) mouse_move_grid_sizer.Add(self.top_right_checkbox, 0, wx.ALL, 10) # 左下角 - self.bottom_left_checkbox = wx.CheckBox(self, label="左下角隐藏窗口") + self.bottom_left_checkbox = wx.CheckBox(self, label="左下角快速隐藏") self.bottom_left_checkbox.SetToolTip(wx.ToolTip("快速移动鼠标至左下角以隐藏窗口")) mouse_move_grid_sizer.Add(self.bottom_left_checkbox, 0, wx.ALL, 10) # 右下角 - self.bottom_right_checkbox = wx.CheckBox(self, label="右下角隐藏窗口") + self.bottom_right_checkbox = wx.CheckBox(self, label="右下角快速隐藏") self.bottom_right_checkbox.SetToolTip(wx.ToolTip("快速移动鼠标至右下角以隐藏窗口")) mouse_move_grid_sizer.Add(self.bottom_right_checkbox, 0, wx.ALL, 10) @@ -90,7 +90,7 @@ def init_UI(self): mouse_box_sizer.Add(mouse_move_grid_sizer, 0, wx.EXPAND | wx.ALL, 10) # 添加允许移动恢复选项 - self.allow_move_restore_checkbox = wx.CheckBox(self, label="允许移动恢复") + self.allow_move_restore_checkbox = wx.CheckBox(self, label="启用移动恢复窗口") self.allow_move_restore_checkbox.SetToolTip(wx.ToolTip("启用后可通过移动鼠标到同一角落恢复已隐藏的窗口")) mouse_box_sizer.Add(self.allow_move_restore_checkbox, 0, wx.ALL, 10) diff --git a/main/core/config.py b/main/core/config.py index db39553..77c41fd 100644 --- a/main/core/config.py +++ b/main/core/config.py @@ -8,8 +8,8 @@ class Config: AppName = "Boss Key" - AppVersion = "v2.0.4.0" - AppReleaseDate = "2025-04-09" + AppVersion = "v2.1.0.0" + AppReleaseDate = "2025-04-21" AppAuthor = "IvanHanloth" AppDescription = "老板来了?快用Boss-Key老板键一键隐藏静音当前窗口!上班摸鱼必备神器" AppCopyRight = "Copyright © 2022-2025 Ivan Hanloth All Rights Reserved." diff --git a/src/static/screenshot-1.png b/src/static/screenshot-1.png index cd5614426f7ce5e9e030863f4c783bfc3e5387e0..e79108cd89ae63db101a4380f4b9bf2dcf1e5a28 100644 GIT binary patch literal 57172 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 K;yF)VfA~K|dS6!n literal 57385 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

>aQTSdWyv8kshztx$%O4CX+nvTz zaL&ARH(h~quk0^s_}PJ@2owsQkW&9HP3vT}$Kt`{`sy0lce-trCYfQ zMecUjoGj}v7w+Oy=WrZa zyWgkqlJ#muQur2hU4Cd!_$aIhsH?v}Wd!cU5PqF_=q|O;R7raaPd?{TDS-Sa7-|;{ z7dt;-$f#YuU-C}lxSYXHbuT~w1YZ9uuwaV@w%ZQYhP%7EV!b4RoOwxw5CGMK_uQ$S zTY!TfwF`RQAA)3QyD0du0_A&HoGP~0!8e5iY7Xz++>eaFMI9T@MPT(JXeEHv<3Xx` z@dg(c7avV|Z=u0|o0ZEbZ7@@K@96u$)fI&Uev=hDpy4KNJ3!(b)SozNWlrVT>jA<^ z49s7J+uD!W`(M6-S`9;Wrm+{GWt=bHr1#>E*=g}Vf4Q(*&l-_>awd3@x)qM=&RVyXw^4)cTlnYqb4$Z&FIKI@k0S#`D}8O}=fSl(T&uU!0OA|EMS`p>{^ z7n-Ke2l?i4M|_)ir50`uUu>#C&PQzX!WR;d!$5LzD`GpOruu_Xvi!tNHU)YR_m zHB;7}KkpL%64w2;XeS<$N&V+;CQ^Ag3^^qnYb<_Nj5{AanmRdGxtKqQNbz;v7=u?` z^r;B?zLEqj{(P~g2e#c3xO3*z|7$fud7uB>ulrX2KmPwo`~ULsk+GW~A${#i|I?lO z_xxMRzrOZel!Ee}M?b6M_k6YA8+38?{|E1DKVG{ZSoijNUR{~0Cg>I{U{YOceDlZB vJ3sP2-JGAR;lJ+gudBz-8mv-Mx>x_NUW$#Qrnh`Y8c3n1tDnm{r-UW|dhrx@ diff --git a/src/static/screenshot-2.png b/src/static/screenshot-2.png deleted file mode 100644 index 3485f07aa1051053b6ce417201a71e2aa96c4c18..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 34064 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�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 literal 6736 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 G@;?B?sx{02 diff --git a/src/static/screenshot-5.png b/src/static/screenshot-5.png new file mode 100644 index 0000000000000000000000000000000000000000..ac0251ed17f06311fe753357e2998b1e48349504 GIT binary patch literal 42913 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 literal 0 HcmV?d00001 From df1f187ccb0281f2690205ca5321f40ece0ac505 Mon Sep 17 00:00:00 2001 From: Ivan Hanloth Date: Mon, 21 Apr 2025 13:17:56 +0800 Subject: [PATCH 18/18] =?UTF-8?q?=E4=BF=AE=E5=A4=8D=E9=9D=9E=E9=A6=96?= =?UTF-8?q?=E6=AC=A1=E5=90=AF=E5=8A=A8=E5=BC=B9=E5=87=BA=E6=8F=90=E7=A4=BA?= =?UTF-8?q?=E9=97=AE=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 3 +++ main/GUI/setting/base.py | 2 +- 2 files changed, 4 insertions(+), 1 deletion(-) diff --git a/README.md b/README.md index bf137e6..eafe7d8 100644 --- a/README.md +++ b/README.md @@ -177,6 +177,9 @@ Boss-Key ## 已知问题 - 无法隐藏部分游戏窗口,可能由于游戏窗口加密导致 +## 鸣谢 +感谢雪藏HsFreezer提供的进程冻结实现思路 + ## 更新日志 **V2.1.0 (更新于2025/4/21)** - 新增鼠标中键、侧键隐藏功能 diff --git a/main/GUI/setting/base.py b/main/GUI/setting/base.py index 511af48..18394b9 100644 --- a/main/GUI/setting/base.py +++ b/main/GUI/setting/base.py @@ -47,7 +47,7 @@ def init_UI(self): sizer.Add(button_sizer, 0, wx.EXPAND | wx.ALL, 10) # 设置提示 - if not Config.first_start: + if Config.first_start: self.infobar.ShowMessage("欢迎使用 Boss Key!本页面仅在首次启动或内容有更新时自动显示,后续可通过托盘图标打开本页面", wx.ICON_INFORMATION) panel.SetSizer(sizer)