当前位置: 首页 > 面试题库 >

Swift中的全局修改器按键检测

姚星宇
2023-03-14
问题内容

我正在尝试使用Carbon的功能RegisterEventHotKey为按下命令键时创建一个热键。我这样使用它:

InstallEventHandler(GetApplicationEventTarget(), handler, 1, &eventType, nil, nil)
RegisterEventHotKey(UInt32(cmdKey), 0, hotKeyID, GetApplicationEventTarget(), 0, &hotKeyRef)

但是,handler仅使用命令键时不会调用。如果我替换cmdKey为其他任何非修饰键代码,则将调用处理程序。

有没有人有任何建议可以让应用程序在按下命令键时全局识别?谢谢。


问题答案:

您可以将与事件匹配的“全局事件监控器”添加.flagsChanged到视图控制器,以便您可以检查它的modifierFlags与deviceIndependentFlagsMask的交集并检查生成的键。

宣言

class func addGlobalMonitorForEvents(matching mask: NSEventMask, handler block: @escaping (NSEvent) -> Void) -> Any?

安装事件监视器,该监视器接收发布到其他应用程序的事件的副本。事件是异步传递到您的应用程序的,您只能观察事件;您不能修改或以其他方式阻止事件传递到其原始目标应用程序。与密钥相关的事件仅在启用了可访问性或信任您的应用程序可访问性的情况下才可以监视。请注意,对于发送到您自己的应用程序的事件,不会调用您的处理程序。

import Cocoa
class ViewController: NSViewController {
    override func viewDidLoad() {
        super.viewDidLoad()
        NSEvent.addGlobalMonitorForEvents(matching: .flagsChanged) {
            switch $0.modifierFlags.intersection(.deviceIndependentFlagsMask) {
            case [.shift]:
                print("shift key is pressed")
            case [.control]:
                print("control key is pressed")
            case [.option] :
                print("option key is pressed")
            case [.command]:
                print("Command key is pressed")
            case [.control, .shift]:
                print("control-shift keys are pressed")
            case [.option, .shift]:
                print("option-shift keys are pressed")
            case [.command, .shift]:
                print("command-shift keys are pressed")
            case [.control, .option]:
                print("control-option keys are pressed")
            case [.control, .command]:
                print("control-command keys are pressed")
            case [.option, .command]:
                print("option-command keys are pressed")
            case [.shift, .control, .option]:
                print("shift-control-option keys are pressed")
            case [.shift, .control, .command]:
                print("shift-control-command keys are pressed")
            case [.control, .option, .command]:
                print("control-option-command keys are pressed")
            case [.shift, .command, .option]:
                print("shift-command-option keys are pressed")
            case [.shift, .control, .option, .command]:
                print("shift-control-option-command keys are pressed")
            default:
                print("no modifier keys are pressed")
            }
        }
    }
}


 类似资料:
  • 我知道并使用了很多绑定的语法,但是我怎么能直接检查事件对象并提取被按下的字母,例如'c'和修饰词,例如'Control'和'Alt'? 我试过这个 偷到Python和Tkinter编程,但它没有显示我正在按的最终修饰符

  • 问题内容: 这是我尝试过的: 不幸的是,它不打印任何内容。 不,它不是一个重复的这个,这个问题是关于修饰键,我的问题是关于按键。 问题答案: 看起来“重复”标记已被删除,但是我将其汇总到注释部分中的答案也已删除。因此,对于后代: 之所以不起作用,是因为与其他一些事件处理程序相比,.keyDown事件的全局监视器需要更多的权限,包括某些人认为与之重复的事件处理程序。这主要是因为全局.keyDown监

  • 问题内容: 我已经搜索了一段时间,每个人似乎都认为仅使用Java是不可能的,所以我给您一个机会;) 有什么方法可以让我的Java应用程序侦听事件(尤其是关键事件),而另一个不相关的应用程序具有窗口焦点?在我的情况下,即使我的Java应用程序没有焦点,我也希望检测用户何时按下了键盘上的“暂停”键。 我听说有人提到,唯一的方法是编写一些C代码并使用JNI。只是好奇是否有人知道避免这种情况的方法?或者,

  • 问题内容: 我用Java制作了一个简单的媒体播放器,但是我 想记录诸如+的全局按键,以暂停/恢复当前正在播放的音乐, 而JFrame没有聚焦, 但是由于JVM安全问题,似乎无法实现。 我遇到了JNativeHook,但是我只想为Windows实现我自己的方法。请建议如何做以及从哪里开始? 问题答案: Jintellitype是一个比较简单的解决方案。 https://code.google.com

  • 问题内容: 让我们建立一个简单的例子: 我如何全局转换发送请求的URL?本质上,我想为每个http请求添加一个URL。 我尝试过的是在应用程序启动时在包含URL的位置设置变量。但这不是我想要我的代码看起来像的样子: 我是否应该考虑研究是否正确?谁能给我一些基本的示例代码? 问题答案: 我有另一种使用带有$ http的请求拦截器的方法,它将在一个公共位置处理所有url。

  • 立即想到的解决方案是创建一个跟踪所有热键的arraylist,并让keylistener每次迭代它,以及另一个带有关联按钮的arraylist的arraylist。 有没有更优雅、更直接的方法?