我正在尝试编写一个MacOS应用程序,它可以通过先前指定的快捷方式切换输入法(此处为
command+space
)。
切换输入法可以正常工作,以便当我输入快捷方式时,状态栏(右上角)的语言图标立即发生变化。
我在这里遇到的问题是实际的输入法没有改变。
例如,如果我在选择的输入法是韩语时运行我的应用程序,那么虽然状态栏在 command+space
之后显示所选的输入法是日语,但我只能输入韩语字符。
但是,当我将焦点转移到另一个文本应用程序(例如从 sublime text 到 xcode)后,只有这样才能很好地反映所选的输入法。
我使用的是 MacOS Monterey 12.6 和 Xcode 13.1。
我的项目包含两个源文件。 文件
AppDelegate.swift
中的代码如下:
import Cocoa
@NSApplicationMain
class AppDelegate: NSObject, NSApplicationDelegate {
var switcher = Switcher()
}
文件中的代码
Switcher.swift
如下:
import Cocoa
import MASShortcut
class Switcher{
var lang: Int = 0
var kr: TISInputSource?
var jp: TISInputSource?
var en: TISInputSource?
init(){
let inputSourceNSArray = TISCreateInputSourceList(nil, false).takeRetainedValue() as NSArray
let inputSourceList = inputSourceNSArray as! [TISInputSource]
for inputSource in inputSourceList {
if inputSource.id == "com.apple.inputmethod.Korean.2SetKorean" {
self.kr = inputSource
}
if inputSource.id == "com.apple.inputmethod.Kotoeri.RomajiTyping.Japanese" {
self.jp = inputSource
}
if inputSource.id == "com.apple.keylayout.ABC" {
self.en = inputSource
}
}
self.register()
}
func switchLang(){
self.lang = (self.lang + 1) % 3
switch lang {
case 0:
TISSelectInputSource(self.kr)
case 1:
TISSelectInputSource(self.jp)
case 2:
TISSelectInputSource(self.en)
default:
print("error")
}
}
func register() {
let langShortcut = MASShortcut(keyCode: kVK_Space, modifierFlags: [.command])
MASShortcutMonitor.shared()?.register(langShortcut, withAction: {
self.switchLang()
})
}
}
我是参考KAWA写的这些代码,但是KAWA并没有提出这个问题。 我已经分析了KAWA的所有代码好几次了,我无法找出为什么同样的问题在KAWA中不会出现。 我对 Swift 很陌生,我不知道如何接近。 你可以帮帮我吗....?谢谢你。
我以前也遇到过这个问题,原因是启用了沙箱。
我也遇到了这个问题,请教一下主解决了吗,或者有答案了踢我一下