2011-01-10 12 views

答えて

6

(つまり、あなたはx86_64のビットのバイナリコンパイルしたい。)あなたは(doubleとして秒の分解能で、現在のアイドル時間を返します - CFTimeInterval)この機能をラップすることができ、タイマーで:

#include <IOKit/IOKitLib.h> 

CFTimeInterval CFDateGetIdleTimeInterval() { 
    mach_port_t port; 
    io_iterator_t iter; 
    CFTypeRef value = kCFNull; 
    uint64_t idle = 0; 
    CFMutableDictionaryRef properties = NULL; 
    io_registry_entry_t entry; 

    IOMasterPort(MACH_PORT_NULL, &port); 
    IOServiceGetMatchingServices(port, IOServiceMatching("IOHIDSystem"), &iter); 
    if (iter) { 
     if ((entry = IOIteratorNext(iter))) { 
      if (IORegistryEntryCreateCFProperties(entry, &properties, kCFAllocatorDefault, 0) == KERN_SUCCESS && properties) { 
       if (CFDictionaryGetValueIfPresent(properties, CFSTR("HIDIdleTime"), &value)) { 
        if (CFGetTypeID(value) == CFDataGetTypeID()) { 
         CFDataGetBytes(value, CFRangeMake(0, sizeof(idle)), (UInt8 *) &idle); 
        } else if (CFGetTypeID(value) == CFNumberGetTypeID()) { 
         CFNumberGetValue(value, kCFNumberSInt64Type, &idle); 
        } 
       } 
       CFRelease(properties); 
      } 
      IOObjectRelease(entry); 
     } 
     IOObjectRelease(iter); 
    } 

    return idle/1000000000.0; 
} 

あなたは、私は別のアプローチを使用IOKit.framework

+0

小さな編集、エントリ= IOIteratorNext(層)はエントリ= IOIteratorNext(iter)でなければなりません。 – Shaun

+0

HIDIdleTimeは信頼性が高くなく、理由がわからないため、一部のMacでは常にゼロを返します(おそらく、接続されているデバイスによってはアイドル時間がリセットされる)ことがあります。 –

0

アップルのTechnical Q&A QA1340 Registering and unregistering for sleep and wake notificationsがあなたが探しているものかもしれません。

NSWorkspaceWillSleepNotification(リスト1)より多くの制御が必要な場合は、I/O Kitを使用して登録して電力通知を受信します(リスト3)。

+0

スリープ/スリープ解除通知に依存する問題は、スリープ設定を「決して」設定しないと、決して送信されないということです。私はキーボード/マウスの活動がない時としてアイドル時間をカウントしたいと思います。 – David

+0

申し訳ありませんが、アプリが理想的な睡眠に入ったときを意味しました。 kperryuaのCGEventSourceSecondsSinceLastEventTypeのソリューションは、最後のユーザー入力以降の監視時間に適しています。 –

5

EventLoopIdleTimerという一定の期間が経過してもユーザーイベントが発生していない場合に通知を送信するCarbon APIがあります。 Uli Kustererはhere (look for UKIdleTimer)のためのCocoaラッパーを書いています。

低レベルが必要な場合は、タイマーとCoreGraphics関数の組み合わせを使用して、動作を実装することができます(<CoreGraphics/CGEventSource.h>で利用可能)。あなたはカーボンにリンクすることができない場合には

+0

iOSでも同じことができますか? – SlowTree

+0

これらのAPIのいずれもiOSでは利用できません。私は同等のものがあるかどうかわかりません。 – kperryua

+0

起動デーモンでCGEventSourceSecondsSinceLastEventTypeを使用しないでください。 –

0

にあなたのコードをリンクする必要があります。 UIApplicationのサブクラス化sendEventメソッドのフィルタリングをオーバーライドします(実際には、あらゆる種類のイベント、アクセラレーション、タッチなどをフィルタリングできます)。 共有変数とバックグラウンドタイマーを使用して、私は "アイドル"を管理しました。 ユーザーが画面に触れるたびに、変数は現在のtimeInterval(現在の時間)で設定されます。 タイマーの起動メソッドは、最後の接触からの経過時間をチェックします。しきい値(私の場合は約90秒です)より大きい場合、あなた自身の通知をPOSTできます。

この単純なアプローチを使用して、ある種のアイドルタイムの後に自動的に「スクリーンセーバー」アプリを呼び出すカスタムアプリを作成しました。

何も巧妙ではなく、ただ仕事をします。

希望に役立ちます。

関連する問題