如何以编程方式在OS X上切换输入法

时间:2014-04-05 19:33:22

标签: macos ime

我试图编写一个在OS X上切换输入法的程序。普通布局没有问题。例如。此代码有效(为简洁起见,剥离了CFReleases / CFRetains):

TISInputSourceRef getref(char* id) {
    CFStringRef name     = CFStringCreateWithCString(kCFAllocatorDefault, id, kCFStringEncodingUTF8);
    CFStringRef keys[]   = { kTISPropertyLocalizedName };
    CFStringRef values[] = { name };
    CFDictionaryRef dict = CFDictionaryCreate(kCFAllocatorDefault, (const void **)keys, (const void **)values, 1, NULL, NULL);
    CFArrayRef array     = TISCreateInputSourceList(dict, true);
    return (TISInputSourceRef) CFArrayGetValueAtIndex(array, 0);
}

int main() {
    TISSelectInputSource(getref("U.S. International - PC"));
}

但是,当我选择输入法而不是布局时:

TISSelectInputSource(getref("Hiragana"));
发生奇怪的事情:在菜单栏中选择并正确显示IM,但是没有启用(键入时会生成罗马字母而不是日语)。如果我然后切换到任何其他应用程序并返回IM开始正常工作。文档中没有提到针对此案例的具体内容。请帮我解决,并提前感谢。

1 个答案:

答案 0 :(得分:0)

试试https://github.com/Yang-Xijie/InputSourceSwitcher

Source Switcher 使用 Applescript 来操作 UI 操作,这比在其他工具中使用 Carbon(大多数 API 已弃用的框架)来更改输入源要好。

您可以在源代码中找到 Applescript 来帮助您以编程方式切换输入源。