全局快捷键不起作用 MacOS - HotKey

Posted

技术标签:

【中文标题】全局快捷键不起作用 MacOS - HotKey【英文标题】:Global Shortcut Key Not Working MacOS - HotKey 【发布时间】:2021-01-07 05:05:35 【问题描述】:

我正在尝试使用 HotKey 实现快捷键“Command + Option + J”,但由于某种原因,它无法在视图控制器之外工作。该应用程序是作为下拉菜单栏实现的,因此没有实际的窗口可以放在前面。我期待我的信息被打印出来。我有两个按钮,注册和取消注册,当我注册并打印出我看到它已注册的组合键时,我相信它正在工作。不幸的是,当我在另一个窗口打开或在桌面视图中按下组合键时,不会打印任何评论。非常感谢任何帮助。

//
//  ViewController.swift
//

import Cocoa
import AppKit
import HotKey
import Carbon

class ViewController: NSViewController 

    @IBOutlet var pressedLabel: NSTextField!
    
    private var hotKey: HotKey? 
        didSet 
            guard let hotKey = hotKey else 
                pressedLabel.stringValue = "Unregistered"
                return
            

            pressedLabel.stringValue = "Registered"
            hotKey.keyDownHandler =  [weak self] in
            NSApplication.shared.orderedWindows.forEach( (window) in
               print("woo")
            )
            
    
    
    
    
    override func viewDidLoad() 
        super.viewDidLoad()
        register(self)
        // Do any additional setup after loading the view.
    
    
    @IBAction func unregister(_ sender: Any?) 
        hotKey = nil
        print("the hot key is ", hotKey?.keyCombo)

        
    
    

    @IBAction func register(_ sender: Any) 
        hotKey = HotKey(keyCombo: KeyCombo(key: .j, modifiers: [.command, .shift])
        )
    
    


【问题讨论】:

在哪里可以找到HotKey github.com/soffes/HotKey 【参考方案1】:

这可能是一个参考问题

private var hotKey: HotKey?

HotKey 配置旨在保持活力。它处理全局按键事件,然后调用回调。如果将它放入视图控制器,然后从屏幕上移除视图控制器的窗口或以其他方式释放它,它的私有 HotKey 引用也将消失,因此事件处理程序将被有效地销毁。

如果是这种情况,您可以将hotKey 属性移动到AppDelegate。然后属性引用将长期存在(确切地说,直到您退出应用程序)。

如果这有帮助,我强烈建议您将逻辑封装在一个小助手中。为简单起见,可以存储为单例。

class HotKeyController 
    static var instance = HotKeyController()
    private init()  

    var hotKey: HotKey? 
        didSet 
            hotKey.keyDownHandler =  [weak self] in
                NSApplication.shared.orderedWindows.forEach( (window) in
                   print("woo")
                )
            
        
    

然后在视图控制器中使用它:

class ViewController: NSViewController 

    @IBOutlet var pressedLabel: NSTextField!
    
    private var hotKey: HotKey? 
        get  
            return HotKeyController.instance.hotKey
        
        set 
            HotKeyController.instance.hotKey = newValue

            guard let hotKey = newValue else 
                pressedLabel.stringValue = "Unregistered"
                return
            

            pressedLabel.stringValue = "Registered"
        
    
    
    override func viewDidLoad() 
        super.viewDidLoad()
        register(self)
        // Do any additional setup after loading the view.
    
    
    @IBAction func unregister(_ sender: Any?) 
        hotKey = nil
        print("the hot key is ", hotKey?.keyCombo)
    
    

    @IBAction func register(_ sender: Any) 
        hotKey = HotKey(keyCombo: KeyCombo(key: .j, modifiers: [.command, .shift]))
        print("the hot key is ", hotKey?.keyCombo)
    

从长远来看,您将希望在HotKeyController 的私有初始化程序中实现基于UserDefaults 的热键存储和恢复,以使设置“固定”。

【讨论】:

以上是关于全局快捷键不起作用 MacOS - HotKey的主要内容,如果未能解决你的问题,请参考以下文章

IDEA中全局搜索不起作用,解决办法

idea全局搜索快捷键Ctrl+Shift+F不起作用

排查IDEA 全局搜索快捷键Ctrl +Shift+F不起作用的原因和解决方法

IDEA 全局搜索快捷键 Ctrl +Shift+F,不起作用啦,啥情况

禁用 全局快捷键

tslint CLI 和 jest CLI 在 iterm zsh macOS 上不起作用