MacOS输入法切换工具仅状态栏变化,需切换窗口才生效问题求助
问题原因
MacOS允许每个应用独立维护自己的输入法状态,你调用的TISSelectInputSource仅修改了系统全局的输入法配置,但当前活跃的应用进程没有同步这个变更——状态栏显示的是全局状态,而当前应用仍在使用自己缓存的输入法设置,只有当窗口切换时,应用才会重新读取全局输入法状态。
修复方案
以下两种方法可以解决这个问题,任选其一即可:
方法一:强制激活当前应用窗口
在调用TISSelectInputSource后,让当前活跃应用的主窗口重新获得焦点,触发应用刷新输入法上下文:
修改Switcher.swift中的switchLang方法:
func switchLang(){ self.lang = (self.lang + 1) % 3 var selectedSource: TISInputSource? switch lang { case 0: selectedSource = self.kr case 1: selectedSource = self.jp case 2: selectedSource = self.en default: print("error") return } guard let source = selectedSource else { return } TISSelectInputSource(source) // 触发当前应用同步输入法状态 if let frontApp = NSWorkspace.shared.frontmostApplication, let mainWindow = frontApp.mainWindow { mainWindow.makeKeyAndOrderFront(nil) NSApp.activate(ignoringOtherApps: false) } }
方法二:模拟空键盘事件(无焦点闪烁)
如果不想出现窗口焦点闪烁的情况,可以通过发送空的键盘事件,让当前应用感知到输入法变化:
首先在Switcher.swift顶部导入CoreGraphics:
import Cocoa import MASShortcut import CoreGraphics // 新增导入
然后修改switchLang方法:
func switchLang(){ self.lang = (self.lang + 1) % 3 var selectedSource: TISInputSource? switch lang { case 0: selectedSource = self.kr case 1: selectedSource = self.jp case 2: selectedSource = self.en default: print("error") return } guard let source = selectedSource else { return } TISSelectInputSource(source) // 发送空按键事件触发应用更新输入法 let pressEvent = CGEvent(keyboardEventSource: nil, virtualKey: 0, keyDown: true) pressEvent?.post(tap: .cghidEventTap) let releaseEvent = CGEvent(keyboardEventSource: nil, virtualKey: 0, keyDown: false) releaseEvent?.post(tap: .cghidEventTap) }
必要权限配置
前往「系统设置」→「隐私与安全性」→「辅助功能」,勾选你的应用,否则上述方法中的窗口激活或事件发送可能无法正常工作。
内容的提问来源于stack exchange,提问作者user365200
相关产品推荐
相关产品推荐

