2012-10-10 28 views
4

什麼是檢測用戶當前在他們的計算機上的最佳方式,即以某種方式使用它。如果用戶在他們的計算機上,我們有一個應用程序只應發出通知(帶有關閉按鈕的橫幅通知)。只顯示用戶是否在計算機上的通知

例如,設想一種股票交易應用程序,用於提醒用戶注意可能與幾分鐘相關的各種時間敏感信息。如果用戶遠離他們的計算機,他們不希望發現20個未處理的警報來解僱。

+0

哎呀,這是兩個不同但非常好的問題答案。這兩個答案都值得接受。 :/ – Jacob

回答

7

技術我不知道如何監視不活動,但我認爲您可以使用超時通知在一定時間間隔後關閉自己和/或將顯示的通知限制爲很少,因此最新的會自動關閉最老的一個。

apple documentation

注:計劃 通知定於火災後的用戶起牀超過15分鐘,就被丟棄。如果 通知以小於15分鐘的時間間隔重複,則其在1分鐘內過期 。過期的通知只會被丟棄,除非他們重複 ,在這種情況下,他們停留在預定列表中,並且稍後再次觸發 。

+1

這是最好的方式,因爲沒有辦法確定「遠離電腦。 – sosborn

2

您可以改爲檢查用戶的空閒時間。假設用戶離開她的電腦走開,IOKit將報告HID(人機接口設備)上的空閒時間。代碼看起來是這樣的:

int64_t getIdleTime(void) { 
    io_iterator_t iter; 
    int64_t idle = 0; 

    // Step 1: Prepare a matching dictionary for "IOHIDSystem", which is the I/O Kit 
    // class which we will query 
    if (IOServiceGetMatchingServices 
     (kIOMasterPortDefault, IOServiceMatching("IOHIDSystem"), &iter) == KERN_SUCCESS) 
      { 
      io_registry_entry_t entry = IOIteratorNext(iter); 

      // Step 2: If we get the classes, get the property: 

      if (entry) { 

      CFMutableDictionaryRef dict; 

      // Query the HIDIdleTime property, if present. 
      if (IORegistryEntryCreateCFProperties(entry, &dict, kCFAllocatorDefault, 0) == KERN_SUCCESS)  
       { 
       CFNumberRef prop = (CFNumberRef) CFDictionaryGetValue(dict, CFSTR("HIDIdleTime")); 
       if (prop) { 
        int64_t nsIdle; 

        // Value is in Nanoseconds, you might want to convert 
        if (CFNumberGetValue(prop, kCFNumberSInt64Type, &nsIdle)) { 
         idle = (nsIdle/1000000000); 
        } 
       } 
       CFRelease(dict); // Be nice. Clean up 
      } 
      IOObjectRelease(entry); // as well as here.. 
     } 
     IOObjectRelease(iter); // and here.. 
    } 
    return idle; 
} 
7

如果鏈接到的ApplicationServices或更高,請嘗試:

CFTimeInterval idleTime = CGEventSourceSecondsSinceLastEventType(kCGEventSourceStateCombinedSessionState, kCGAnyInputEventType); 

時間因爲對於事件源最後一個事件。

kCGAnyInputEventType eventType將報告任何輸入事件,鍵盤,鼠標或平板電腦的上次時間戳。各種系統和應用程序定義的事件不會影響此事件類型的時間。

此外,從登錄會話中發佈的程序或應用程序應使用kCGEventSourceStateCombinedSessionState。

解釋硬件狀態和生成事件的用戶空間設備驅動程序應使用kCGEventSourceStateHIDSystemState。

CG_EXTERN CFTimeInterval CGEventSourceSecondsSinceLastEventType(CGEventSourceStateID source,CGEventType eventType)AVAILABLE_MAC_OS_X_VERSION_10_4_AND_LATER;

相關問題