2011-01-10 8 views

Respuesta

6

En caso de que no se puede vincular al carbono (. Es decir, se desea compilar bits x86_64 binario) se puede envolver esta función (que devuelve el tiempo de inactividad actual en la resolución segundos como doble - CFTimeInterval) en un contador de tiempo:

#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; 
} 

tendrá que enlazar el código de IOKit.framework

+0

Edición pequeña, entrada = IOIteratorNext (nivel) debe ser entry = IOIteratorNext (iter). – Shaun

+0

Tenga en cuenta que HIDIdleTime no es muy confiable y siempre devuelve cero en algunos Mac por razones desconocidas (probablemente algunos dispositivos conectados reinician el recuento de tiempo inactivo). –

0

Apple Technical Q&A QA1340 Registering and unregistering for sleep and wake notifications puede ser lo que estás buscando.

Si necesita más control que NSWorkspaceWillSleepNotification (Listado 1), use el Kit de E/S y regístrese para recibir notificaciones de energía (Listado 3).

+0

El problema de depender de las notificaciones de suspensión/activación es que si un usuario establece su configuración de suspensión como "nunca", nunca se enviará. Me gustaría contar el tiempo de inactividad como el tiempo cuando no hay actividad de teclado/mouse. – David

+0

Lo sentimos, aunque quisiste decir cuando la aplicación entra en modo de suspensión ideal. La solución de kperryua con CGEventSourceSecondsSinceLastEventType es correcta para el tiempo de monitoreo desde la última entrada del usuario. –

5

Hay una API de Carbon que enviará una notificación cuando no haya habido un evento de usuario después de una cierta duración llamada EventLoopIdleTimer. Uli Kusterer ha escrito un contenedor de Cocoa para here (look for UKIdleTimer).

Si desea algo de nivel inferior, puede implementar el comportamiento que desee con una combinación de temporizadores y la función CoreGraphics CGEventSourceSecondsSinceLastEventType (disponible en <CoreGraphics/CGEventSource.h>).

+0

¿Es posible hacer lo mismo en iOS? – SlowTree

+0

Ninguna de estas API está disponible en iOS. No sé si hay equivalentes tampoco. – kperryua

+0

No utilice CGEventSourceSecondsSinceLastEventType en el demonio de inicio. –

0

que utilizan un enfoque diferente. Subclassing UIApplication Sobreescribo los toques de filtrado del método sendEvent (en realidad puedes filtrar cualquier tipo de evento, aceleración, toques, etc.). Utilizando una variable compartida y un temporizador de fondo, gestioné el "inactivo". Cada vez que el usuario toca la pantalla, la variable se configura con el time interval actual (hora actual). El método de disparo con temporizador comprueba el tiempo transcurrido desde el último toque, si es mayor que el umbral (en mi caso fue de alrededor de 90 segundos) puede PUBLICAR su propia notificación.

Utilicé este enfoque simple para crear un conjunto personalizado de aplicaciones que después de un tiempo inactivo llaman automáticamente a la aplicación "protector de pantalla".

Nada inteligente, solo hace el trabajo.

Espero que ayude.

Cuestiones relacionadas