2014-09-24 64 views
0

有誰知道如何檢測用戶何時在OSX中更改當前輸入源?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最終被「融爲一體。 apple.keylayout.German「,這大部分是我想要的。不包括:

  1. TISCopyCurrentKeyboardInputSource()的結果不會改變,一旦我的過程開始了?特別是,我可以在循環中調用TISCopyCurrentKeyboardInputSource()並切換我的輸入源,但TISCopyCurrentKeyboardInputSource()會一直返回我的進程啓動時的輸入源。
  2. 我很想在輸入源發生更改時收到通知。有沒有辦法做到這一點?要獲得通知或某種事件告訴我輸入源已更改?

回答

2

您可以觀察NSTextInputContext發送給默認Cocoa通知中心的NSTextInputContextKeyboardSelectionDidChangeNotification通知。或者,您可以觀察通過Core Foundation分佈式通知中心發送的kTISNotifySelectedKeyboardInputSourceChanged通知。

但是,任何此類更改都是在您的應用程序外部的系統進程中開始的。系統然後通知每個應用程序進程中的框架。框架只有在允許運行其事件循環時才能收到此類通知。同樣,如果你自己觀察分佈式通知,那麼只有當事件循環(或者至少是主線程的運行循環)被允許運行時纔會發生這種情況。

所以,這就解釋了爲什麼運行循環重複檢查TISCopyCurrentKeyboardInputSource()的結果不起作用。您不允許框架監視通知它將被告知更改的渠道。如果不是一個循環,而是使用頻率足夠低的重複計時器,以使其他內容有機會運行,並且您將控制權交還給應用程序的事件循環,則會看到TISCopyCurrentKeyboardInputSource()的結果發生變化。

+0

謝謝!很棒。 – 2014-09-25 17:11:26