fix: always occupies hotkey globally when app launch silently (#5866)

* fix: always occupies hotkey when app launch silently

* docs: update Changelog.md

* chore: update
This commit is contained in:
oomeow 2025-12-18 22:21:15 +08:00 committed by GitHub
parent 9713343323
commit a1286ad057
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
6 changed files with 28 additions and 52 deletions

View File

@ -29,6 +29,7 @@
- 修复 Windows 下自定义标题栏按钮在最小化 / 关闭后 hover 状态残留 - 修复 Windows 下自定义标题栏按钮在最小化 / 关闭后 hover 状态残留
- 修复直接覆盖 `config.yaml` 使用时无法展开代理组 - 修复直接覆盖 `config.yaml` 使用时无法展开代理组
- 修复 macOS 下应用启动时系统托盘图标颜色闪烁 - 修复 macOS 下应用启动时系统托盘图标颜色闪烁
- 修复应用静默启动模式下非全局热键一直抢占其他应用按键问题
<details> <details>
<summary><strong> ✨ 新增功能 </strong></summary> <summary><strong> ✨ 新增功能 </strong></summary>

View File

@ -287,8 +287,12 @@ singleton!(Hotkey, INSTANCE);
impl Hotkey { impl Hotkey {
pub async fn init(&self, skip: bool) -> Result<()> { pub async fn init(&self, skip: bool) -> Result<()> {
if skip {
logging!(debug, Type::Hotkey, "skip register all hotkeys");
return Ok(());
}
let verge = Config::verge().await; let verge = Config::verge().await;
let enable_global_hotkey = !skip && verge.data_arc().enable_global_hotkey.unwrap_or(true); let enable_global_hotkey = verge.latest_arc().enable_global_hotkey.unwrap_or(true);
logging!( logging!(
debug, debug,
@ -298,7 +302,7 @@ impl Hotkey {
); );
// Extract hotkeys data before async operations // Extract hotkeys data before async operations
let hotkeys = verge.data_arc().hotkeys.clone(); let hotkeys = verge.latest_arc().hotkeys.clone();
if let Some(hotkeys) = hotkeys { if let Some(hotkeys) = hotkeys {
logging!(debug, Type::Hotkey, "Has {} hotkeys need to register", hotkeys.len()); logging!(debug, Type::Hotkey, "Has {} hotkeys need to register", hotkeys.len());

View File

@ -336,7 +336,9 @@ pub fn run() {
.register_system_hotkey(SystemHotkey::CmdW) .register_system_hotkey(SystemHotkey::CmdW)
.await; .await;
} }
let _ = hotkey::Hotkey::global().init(true).await; if !is_enable_global_hotkey {
let _ = hotkey::Hotkey::global().init(false).await;
}
return; return;
} }

View File

@ -131,7 +131,9 @@ pub(super) async fn init_timer() {
} }
pub(super) async fn init_hotkey() { pub(super) async fn init_hotkey() {
logging_error!(Type::Setup, Hotkey::global().init(false).await); // if hotkey is not use by global, skip init it
let skip_register_hotkeys = !Config::verge().await.latest_arc().enable_global_hotkey.unwrap_or(true);
logging_error!(Type::Setup, Hotkey::global().init(skip_register_hotkeys).await);
} }
pub(super) async fn init_auto_lightweight_boot() { pub(super) async fn init_auto_lightweight_boot() {

View File

@ -101,3 +101,9 @@ window.addEventListener("beforeunload", () => {
// Clean up all WebSocket instances to prevent memory leaks // Clean up all WebSocket instances to prevent memory leaks
MihomoWebSocket.cleanupAll(); MihomoWebSocket.cleanupAll();
}); });
// Page loaded event
window.addEventListener("DOMContentLoaded", () => {
// Clean up all WebSocket instances to prevent memory leaks
MihomoWebSocket.cleanupAll();
});

View File

@ -1,53 +1,9 @@
import { KeyboardEvent } from "react"; import { KeyboardEvent } from "react";
import { debugLog } from "@/utils/debug"; import getSystem from "./get-system";
const KEY_MAP: Record<string, string> = { const OS = getSystem();
// Option + 特殊字符映射
"": "Minus", // Option + -
"≠": "Equal", // Option + =
"\u201C": "BracketLeft", // Option + [
"\u2019": "BracketRight", // Option + ]
"«": "Backslash", // Option + \
"…": "Semicolon", // Option + ;
æ: "Quote", // Option + '
"≤": "Comma", // Option + ,
"≥": "Period", // Option + .
"÷": "Slash", // Option + /
// Option组合键映射
Å: "A",
"∫": "B",
Ç: "C",
"∂": "D",
"´": "E",
ƒ: "F",
"©": "G",
"˙": "H",
ˆ: "I",
"∆": "J",
"˚": "K",
"¬": "L",
µ: "M",
"˜": "N",
Ø: "O",
π: "P",
Œ: "Q",
"®": "R",
ß: "S",
"†": "T",
"¨": "U",
"√": "V",
"∑": "W",
"≈": "X",
"¥": "Y",
Ω: "Z",
};
const mapKeyCombination = (key: string): string => {
const mappedKey = KEY_MAP[key] || key;
return `${mappedKey}`;
};
export const parseHotkey = (keyEvent: KeyboardEvent) => { export const parseHotkey = (keyEvent: KeyboardEvent) => {
const nativeEvent = keyEvent.nativeEvent; const nativeEvent = keyEvent.nativeEvent;
const key = nativeEvent.code; const key = nativeEvent.code;
@ -64,16 +20,21 @@ export const parseHotkey = (keyEvent: KeyboardEvent) => {
} else if (temp.endsWith("RIGHT")) { } else if (temp.endsWith("RIGHT")) {
temp = temp.slice(0, -5); temp = temp.slice(0, -5);
} }
debugLog(temp, mapKeyCombination(temp));
switch (temp) { switch (temp) {
case "CONTROL": case "CONTROL":
return "CTRL"; return "CTRL";
case "ALT":
if (OS === "macos") {
return "OPTION";
} else {
return "ALT";
}
case "META": case "META":
return "CMD"; return "CMD";
case " ": case " ":
return "SPACE"; return "SPACE";
default: default:
return KEY_MAP[temp] || temp; return temp;
} }
}; };