From a4f867665feebd692a1ce25cce0524b672658fce Mon Sep 17 00:00:00 2001 From: AoXuan Date: Sat, 26 Jul 2025 00:27:41 +0800 Subject: [PATCH] =?UTF-8?q?feat(power):=20=E6=B7=BB=E5=8A=A0=E5=BC=BA?= =?UTF-8?q?=E5=88=B6=E5=85=B3=E6=9C=BA=E5=8A=9F=E8=83=BD=E5=B9=B6=E4=BC=98?= =?UTF-8?q?=E5=8C=96=E5=85=B3=E6=9C=BA=E6=B5=81=E7=A8=8B?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/core/timer.py | 1 + app/services/system.py | 20 +++++++++++++++++++- app/ui/dispatch_center.py | 2 ++ 3 files changed, 22 insertions(+), 1 deletion(-) diff --git a/app/core/timer.py b/app/core/timer.py index 537ce09..e41a2f0 100644 --- a/app/core/timer.py +++ b/app/core/timer.py @@ -146,6 +146,7 @@ class _MainTimer(QObject): "Sleep": "睡眠", "Hibernate": "休眠", "Shutdown": "关机", + "ShutdownForce": "关机(强制)" } choice = ProgressRingMessageBox( diff --git a/app/services/system.py b/app/services/system.py index 734cda1..9ab8636 100644 --- a/app/services/system.py +++ b/app/services/system.py @@ -193,7 +193,7 @@ class _SystemHandler: """ 执行系统电源操作 - :param mode: 电源操作模式,支持 "NoAction", "Shutdown", "Hibernate", "Sleep", "KillSelf" + :param mode: 电源操作模式,支持 "NoAction", "Shutdown", "Hibernate", "Sleep", "KillSelf", "ShutdownForce" """ if sys.platform.startswith("win"): @@ -205,8 +205,15 @@ class _SystemHandler: elif mode == "Shutdown": logger.info("执行关机操作", module="系统服务") + logger.info("正在清除模拟器进程",module="系统服务") + self.kill_emulator_processes() + logger.info("清除模拟器进程完成,正在关机",module="系统服务") subprocess.run(["shutdown", "/s", "/t", "0"]) + elif mode == "ShutdownForce": + logger.info("执行强制关机操作", module="系统服务") + subprocess.run(["shutdown", "/s", "/t", "0", "/f"]) + elif mode == "Hibernate": logger.info("执行休眠操作", module="系统服务") @@ -254,6 +261,17 @@ class _SystemHandler: QApplication.quit() sys.exit(0) + def kill_emulator_processes(self): + # 这里暂时仅支持 MuMu 模拟器 + keywords = ["Nemu", "nemu", "emulator","MuMu"] + for proc in psutil.process_iter(["pid", "name"]): + try: + pname = proc.info["name"].lower() + if any(keyword.lower() in pname for keyword in keywords): + proc.kill() + logger.info(f"已关闭 MuMu 模拟器进程: {proc.info['name']}", module="系统服务") + except (psutil.NoSuchProcess, psutil.AccessDenied): + continue def is_startup(self) -> bool: """判断程序是否已经开机自启""" diff --git a/app/ui/dispatch_center.py b/app/ui/dispatch_center.py index 1d9d531..08d7d2a 100644 --- a/app/ui/dispatch_center.py +++ b/app/ui/dispatch_center.py @@ -70,6 +70,7 @@ class DispatchCenter(QWidget): self.power_combox.addItem("睡眠", userData="Sleep") self.power_combox.addItem("休眠", userData="Hibernate") self.power_combox.addItem("关机", userData="Shutdown") + self.power_combox.addItem("关机(强制)", userData="ShutdownForce") self.power_combox.setCurrentText("无动作") self.power_combox.currentIndexChanged.connect(self.set_power_sign) @@ -277,6 +278,7 @@ class DispatchCenter(QWidget): "Sleep": "睡眠", "Hibernate": "休眠", "Shutdown": "关机", + "ShutdownForce": "关机(强制)" } self.power_combox.currentIndexChanged.disconnect() self.power_combox.setCurrentText(mode_book[Config.power_sign])