Project Icon

KeyboardShortcuts

macOS快捷键定制开发库 简化全局快捷键实现

KeyboardShortcuts是一个macOS开发库,可快速为应用添加用户自定义全局快捷键功能。该库兼容沙盒和Mac App Store,提供简洁API、支持SwiftUI和Cocoa,并具备本地化能力。它易于使用,支持动态快捷键和默认设置,适用于各类macOS应用开发。多个知名应用已采用KeyboardShortcuts实现快捷键功能。

KeyboardShortcuts KeyboardShortcuts

这个包让您可以在几分钟内为您的 macOS 应用添加用户自定义全局键盘快捷键支持。它完全兼容沙盒和 Mac App Store。它已在 DatoJiffyPlashLungo 等产品中使用。

我很乐意接受更多的配置和功能。欢迎提交 PR!这里看到的只是我自己的应用所需要的功能。

要求

macOS 10.15+

安装

在 Xcode 的"Swift Package Manager"标签中添加 https://github.com/sindresorhus/KeyboardShortcuts

使用方法

首先,为键盘快捷键注册一个名称。

Constants.swift

import KeyboardShortcuts

extension KeyboardShortcuts.Name {
	static let toggleUnicornMode = Self("toggleUnicornMode")
}

然后您可以在其他地方引用这个强类型名称。

您需要创建一个视图,让用户选择键盘快捷键。

SettingsScreen.swift

import SwiftUI
import KeyboardShortcuts

struct SettingsScreen: View {
	var body: some View {
		Form {
			KeyboardShortcuts.Recorder("切换独角兽模式:", name: .toggleUnicornMode)
		}
	}
}

也有支持 Cocoa 而非 SwiftUI 的版本。

KeyboardShortcuts.Recorder 负责将键盘快捷键存储在 UserDefaults 中,并在用户选择的键盘快捷键已被系统或应用主菜单使用时警告用户。

为用户按下所选键盘快捷键时添加监听器。

App.swift

import SwiftUI
import KeyboardShortcuts

@main
struct YourApp: App {
	@StateObject private var appState = AppState()

	var body: some Scene {
		WindowGroup {
			// …
		}
		Settings {
			SettingsScreen()
		}
	}
}

@MainActor
final class AppState: ObservableObject {
	init() {
		KeyboardShortcuts.onKeyUp(for: .toggleUnicornMode) { [self] in
			isUnicornMode.toggle()
		}
	}
}

您也可以使用 .onKeyDown() 监听按键按下

就是这么简单!✨

您可以在"Example"目录中找到一个完整的示例。

您还可以在我的 Plash 应用中找到一个真实世界的例子

Cocoa

使用 KeyboardShortcuts.RecorderCocoa 替代 KeyboardShortcuts.Recorder

import AppKit
import KeyboardShortcuts

final class SettingsViewController: NSViewController {
	override func loadView() {
		view = NSView()

		let recorder = KeyboardShortcuts.RecorderCocoa(for: .toggleUnicornMode)
		view.addSubview(recorder)
	}
}

本地化

这个包支持本地化。欢迎提交更多语言的 PR!

  1. Fork 这个仓库。
  2. 创建一个使用 ISO 639-1 语言代码和可选标识符命名的目录,后缀为 .lproj更多信息在此。
  3. 在新的语言目录下创建一个名为 Localizable.strings 的文件,然后将 KeyboardShortcuts/Localization/en.lproj/Localizable.strings 的内容复制到您刚创建的新文件中。
  4. 进行本地化,并确保多次检查您的本地化内容。检查是否有拼写错误。
  5. 尝试找一个会说您的语言的人来审核翻译。
  6. 提交 PR。

API

查看 API 文档。

提示

NSMenuItem 中显示已记录的键盘快捷键

参见 NSMenuItem#setShortcut

动态键盘快捷键

您的应用可能需要支持用户自定义操作的键盘快捷键。通常,您会在 extension KeyboardShortcuts.Name {} 中静态注册键盘快捷键。但这并非必需。这只是为了方便您在调用各种 API 时使用点语法(例如,.onKeyDown(.unicornMode) {})。您可以动态创建 KeyboardShortcut.Name 并自行存储。您可以在示例项目中看到这一点。

默认键盘快捷键

如果您正在从其他包迁移或只是为自己制作某些东西,设置默认键盘快捷键可能会很有用。但是,请不要为公开发布的应用设置这个。用户会觉得随机应用窃取他们现有的键盘快捷键很烦人。通常最好在首次启动应用时显示欢迎界面,让用户自行设置快捷键。

import KeyboardShortcuts

extension KeyboardShortcuts.Name {
    static let toggleUnicornMode = Self("toggleUnicornMode", default: .init(.k, modifiers: [.command, .option]))
}

获取所有键盘快捷键

要获取所有键盘快捷键的 Name,让 KeyboardShortcuts.Name 遵循 CaseIterable 协议。

import KeyboardShortcuts

extension KeyboardShortcuts.Name {
    static let foo = Self("foo")
    static let bar = Self("bar")
}

extension KeyboardShortcuts.Name: CaseIterable {
    public static let allCases: [Self] = [
        .foo,
        .bar
    ]
}

// …

print(KeyboardShortcuts.Name.allCases)

要获取所有设置了键盘快捷键的 Name

print(KeyboardShortcuts.Name.allCases.filter { $0.shortcut != nil })

常见问题

它与 MASShortcut 有何不同?

本包:

  • 用 Swift 编写,具有 Swift 风格的 API。
  • UI 组件外观更接近原生。
  • 包含 SwiftUI 组件。
  • 支持监听按键按下,而不仅仅是按键释放。
  • 支持 Swift Package Manager。
  • 可以将快捷键连接到 NSMenuItem
  • NSMenu 打开时也能工作(例如菜单栏应用)。

MASShortcut

  • 更成熟。
  • 更多本地化支持。

它与 HotKey 有何不同?

HotKey 适合添加硬编码的键盘快捷键,但它不提供任何 UI 组件让用户选择自己的键盘快捷键。

为什么这个包导入了 Carbon?这不是已经废弃了吗?

大多数 Carbon API 多年前就被废弃了,但还有一些 Apple 从未提供现代替代品的 API。这包括注册全局键盘快捷键。但是,您不需要担心这个。在废弃这里使用的 Carbon API 之前,Apple 肯定会提供新的 API。

这个包会导致任何权限对话框吗?

不会。

我如何添加一个只在应用处于活动状态时有效的应用特定键盘快捷键?

这超出了本包的范围。您可以使用 NSEvent.addLocalMonitorForEvents带键盘快捷键的 NSMenuItem(它甚至可以隐藏),或 SwiftUI 的 View#keyboardShortcut() 修饰符

它支持媒体键吗?

不支持,因为这对沙盒应用不起作用。如果您的应用不是沙盒应用,可以使用 MediaKeyTap

你能支持 CocoaPods 或 Carthage 吗?

不能。但是,即使您通常使用 CocoaPods 或 Carthage,也没有什么阻止您仅为这个包使用 Swift Package Manager。

相关

项目侧边栏1项目侧边栏2
推荐项目
Project Cover

豆包MarsCode

豆包 MarsCode 是一款革命性的编程助手,通过AI技术提供代码补全、单测生成、代码解释和智能问答等功能,支持100+编程语言,与主流编辑器无缝集成,显著提升开发效率和代码质量。

Project Cover

AI写歌

Suno AI是一个革命性的AI音乐创作平台,能在短短30秒内帮助用户创作出一首完整的歌曲。无论是寻找创作灵感还是需要快速制作音乐,Suno AI都是音乐爱好者和专业人士的理想选择。

Project Cover

有言AI

有言平台提供一站式AIGC视频创作解决方案,通过智能技术简化视频制作流程。无论是企业宣传还是个人分享,有言都能帮助用户快速、轻松地制作出专业级别的视频内容。

Project Cover

Kimi

Kimi AI助手提供多语言对话支持,能够阅读和理解用户上传的文件内容,解析网页信息,并结合搜索结果为用户提供详尽的答案。无论是日常咨询还是专业问题,Kimi都能以友好、专业的方式提供帮助。

Project Cover

阿里绘蛙

绘蛙是阿里巴巴集团推出的革命性AI电商营销平台。利用尖端人工智能技术,为商家提供一键生成商品图和营销文案的服务,显著提升内容创作效率和营销效果。适用于淘宝、天猫等电商平台,让商品第一时间被种草。

Project Cover

吐司

探索Tensor.Art平台的独特AI模型,免费访问各种图像生成与AI训练工具,从Stable Diffusion等基础模型开始,轻松实现创新图像生成。体验前沿的AI技术,推动个人和企业的创新发展。

Project Cover

SubCat字幕猫

SubCat字幕猫APP是一款创新的视频播放器,它将改变您观看视频的方式!SubCat结合了先进的人工智能技术,为您提供即时视频字幕翻译,无论是本地视频还是网络流媒体,让您轻松享受各种语言的内容。

Project Cover

美间AI

美间AI创意设计平台,利用前沿AI技术,为设计师和营销人员提供一站式设计解决方案。从智能海报到3D效果图,再到文案生成,美间让创意设计更简单、更高效。

Project Cover

AIWritePaper论文写作

AIWritePaper论文写作是一站式AI论文写作辅助工具,简化了选题、文献检索至论文撰写的整个过程。通过简单设定,平台可快速生成高质量论文大纲和全文,配合图表、参考文献等一应俱全,同时提供开题报告和答辩PPT等增值服务,保障数据安全,有效提升写作效率和论文质量。

投诉举报邮箱: service@vectorlightyear.com
@2024 懂AI·鲁ICP备2024100362号-6·鲁公网安备37021002001498号