* 注册全局快捷键(支持双击修饰键)
(shortcut?: string)
| 636 | * 注册全局快捷键(支持双击修饰键) |
| 637 | */ |
| 638 | public registerShortcut(shortcut?: string): boolean { |
| 639 | const keyToRegister = shortcut || this.currentShortcut |
| 640 | |
| 641 | // 保存旧的快捷键信息,用于注册失败时回滚 |
| 642 | const oldShortcut = this.currentShortcut |
| 643 | const oldIsDoubleTapMode = this.isDoubleTapMode |
| 644 | |
| 645 | // 注销旧的呼出快捷键(仅注销当前快捷键,不影响其他全局快捷键) |
| 646 | if (this.isDoubleTapMode) { |
| 647 | const oldModifier = this.currentShortcut.split('+')[0] |
| 648 | doubleTapManager.unregister(oldModifier) |
| 649 | } else { |
| 650 | globalShortcut.unregister(this.currentShortcut) |
| 651 | } |
| 652 | |
| 653 | // 双击修饰键模式:通过 doubleTapManager 注册 |
| 654 | if (this.isDoubleTapShortcut(keyToRegister)) { |
| 655 | const modifier = keyToRegister.split('+')[0] |
| 656 | doubleTapManager.register(modifier, () => { |
| 657 | this.toggleWindowFromDoubleTap() |
| 658 | }) |
| 659 | this.currentShortcut = keyToRegister |
| 660 | this.isDoubleTapMode = true |
| 661 | console.log(`双击修饰键呼出快捷键 ${keyToRegister} 注册成功`) |
| 662 | return true |
| 663 | } |
| 664 | |
| 665 | // 普通快捷键模式:通过 globalShortcut 注册 |
| 666 | const ret = globalShortcut.register(keyToRegister, () => { |
| 667 | this.toggleWindow() |
| 668 | }) |
| 669 | |
| 670 | if (!ret) { |
| 671 | console.error(`快捷键注册失败: ${keyToRegister} 已被占用,回滚到旧快捷键: ${oldShortcut}`) |
| 672 | // 注册失败,回滚:重新注册旧的快捷键 |
| 673 | if (oldIsDoubleTapMode) { |
| 674 | const oldModifier = oldShortcut.split('+')[0] |
| 675 | doubleTapManager.register(oldModifier, () => { |
| 676 | this.toggleWindowFromDoubleTap() |
| 677 | }) |
| 678 | } else { |
| 679 | globalShortcut.register(oldShortcut, () => { |
| 680 | this.toggleWindow() |
| 681 | }) |
| 682 | } |
| 683 | return false |
| 684 | } else { |
| 685 | this.currentShortcut = keyToRegister |
| 686 | this.isDoubleTapMode = false |
| 687 | console.log(`快捷键 ${keyToRegister} 注册成功`) |
| 688 | } |
| 689 | |
| 690 | return ret |
| 691 | } |
| 692 | |
| 693 | public setPreviousActiveWindow( |
| 694 | windowInfo: { |
no test coverage detected