2014-10-28 80 views
-1

我想在Windows中獲取類似GetKeyboardLayout(threadId)的鍵盤佈局。 threadId是具有活動窗口的應用程序的ID。我想將虛擬鍵碼翻譯成當前語言的字符。OS X.如何在守護進程中獲取當前所有系統活動窗口的TISInputSourceRef(鍵盤佈局)?

現在我使用TISCopyCurrentKeyboardInputSource()函數,但它沒有參數,它只返回「U」。語言。我認爲這是守護進程的佈局。 另外我無法使用TISCopyInputSourceForLanguage(language)函數的TISInputSourceRef轉換代碼。它只返回美國字符。

更新: Okey。我找到了轉換keyCodes的解決方案。我使用參數修飾符等於0來調用函數UCKeyTranslate。但是我找不到如何獲取活動窗口的輸入源或者只是任何正在運行的應用程序。

更新2:的plist路徑是/庫/ LaunchAgents

<?xml version="1.0" encoding="UTF-8"?> 
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd"> 

<plist version="1.0"> 
    <dict> 
    <key>Label</key> 
    <string>my.keylogger</string> 
    <key>Program</key> 
    <string>/Users/Titan/Desktop/keylogger</string> 
    <key>ProgramArguments</key> 
    <array> 
     <string>keylogger</string> 
    </array> 
    <key>KeepAlive</key> 
    <true/> 
    </dict> 
</plist> 

回答

0

每當你想從一個後臺程序訪問用戶會話的狀態,你就錯了™。它不能被可靠地工作。

標準解決方案是使用在每個用戶會話中啓動的用戶代理。如有必要,每個代理都可以聯繫中央守護程序並報告用戶會話的狀態。

請參閱Technical Note TN2083: Daemons and Agents瞭解更多詳情。


更新:

以上技術文檔相關理解爲什麼你不能做到這一點,從一個守護進程。

對於代理,它應該使用分佈式通知中心觀察kTISNotifySelectedKeyboardInputSourceChanged通知,以瞭解何時所選鍵盤輸入源發生更改。然後它可以調用TISCopyCurrentKeyboardInputSource()來了解哪些鍵盤輸入源是最新的。

爲了讓代理接收通知,它必須以其中一種常用模式運行主線程的運行循環。在一個普通的Cocoa應用程序中,這是作爲主事件循環的一部分完成的。在另一種程序中,你必須自己做這個。

BOOL shouldKeepRunning = YES;  // global 
... 

[[NSDistributedNotificationCenter defaultCenter] addObserver:self 
                selector:@selector(myMethod:) 
                 name:(__bridge NSString*)kTISNotifySelectedKeyboardInputSourceChanged 
                 object:nil 
              suspensionBehavior:NSNotificationSuspensionBehaviorDeliverImmediately]; 

while (shouldKeepRunning && [[NSRunLoop currentRunLoop] runMode:NSDefaultRunLoopMode beforeDate:[NSDate distantFuture]]) 
    /* do nothing */; 

... 
- (void) myMethod:(NSNotification*)note 
{ 
    TISInputSourceRef inputSource = TISCopyCurrentKeyboardInputSource(); 
    // do something with inputSource ... 
} 
+0

謝謝。我會朝這個方向看,然後寫下我的結果。 – 2014-11-02 08:42:20

+0

我讀過這篇文章,但我仍然不明白如何獲得最前面的應用程序的輸入源。這是我的第一個這樣的程序,我不知道這是什麼用途。程序必須爲每個用戶寫一個日誌。它不需要與中央守護進程通信(如我所想)。 – 2014-11-02 11:43:12

+0

我已經更新了我的答案,並提供了進一步的解釋和示例代碼 – 2014-11-02 17:38:58

相關問題