gpt4 book ai didi

macos - OSX Cocoa 输入源检测变化

转载 作者:行者123 更新时间:2023-12-03 17:31:27 26 4
gpt4 key购买 nike

有谁知道如何检测用户何时更改 OSX 中的当前输入源?

Switching my keyboard settings to German

我可以调用 TISCopyCurrentKeyboardInputSource() 来找出正在使用哪个输入源 ID,如下所示:

    TISInputSourceRef isource = TISCopyCurrentKeyboardInputSource();
if ( isource == NULL )
{
cerr << "Couldn't get the current input source\n.";
return -1;
}

CFStringRef id = (CFStringRef)TISGetInputSourceProperty(
isource,
kTISPropertyInputSourceID);
CFRelease(isource);

如果我的输入源是“德语”,那么 id 最终会是“com.apple.keylayout.German”,这正是我想要的。除外:

  1. 一旦我的进程开始,TISCopyCurrentKeyboardInputSource() 的结果就不会改变?特别是,我可以循环调用 TISCopyCurrentKeyboardInputSource() 并切换我的输入源,但 TISCopyCurrentKeyboardInputSource() 不断返回我的进程开始时使用的输入源。
  2. 我真的希望在输入源发生更改时收到通知。有什么办法可以做到这一点吗?想要收到通知或某种事件告诉我输入源已更改?

最佳答案

您可以观察由 NSTextInputContext 发布到默认 Cocoa 通知中心的 NSTextInputContextKeyboardSelectionDidChangeNotification 通知。或者,您可以观察通过 Core Foundation 分布式通知中心传递的 kTISNotifySelectedKeyboardInputSourceChanged 通知。

但是,任何此类更改都会在应用程序外部的系统进程中启动。然后系统通知每个应用程序进程中的框架。仅当框架被允许运行其事件循环时才能接收此类通知。同样,如果您自己观察分布式通知,则只有在允许运行事件循环(或至少主线程的运行循环)时才会发生这种情况。

因此,这解释了为什么运行重复检查 TISCopyCurrentKeyboardInputSource() 结果的循环不起作用。您不允许框架监视通知更改的 channel 。如果您使用频率足够低的重复计时器而不是循环,以便其他东西有机会运行,并且您将控制返回到应用程序的事件循环,您将看到 TISCopyCurrentKeyboardInputSource() 的结果改变。

关于macos - OSX Cocoa 输入源检测变化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26024400/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com