2011-02-18 17 views
5

Por lo tanto, estoy construyendo un programa que estará en una exposición para uso público, y tengo una tarea para hacer un estado inactivo para él. Solo muestre algunos videos aleatorios de una carpeta en la pantalla, como un salvapantallas pero en la aplicación.¿La mejor manera de saber si la aplicación está inactiva en cocoa mac OSX?

Entonces, ¿cuál es la mejor y más adecuada manera de verificar si el usuario está inactivo?

Lo que estoy pensando es algún tipo de temporizador global que se restablece en cada entrada de usuario y, si llega, digamos que 1 minuto pasa al modo inactivo. ¿Hay alguna forma mejor?

Respuesta

1

Eche un vistazo a this article que cubre el uso de IOKit para leer el tiempo de inactividad de un usuario de IOHID.

1

Esto puede sonar como una pregunta tonta; pero ¿por qué no simplemente configurar un salvapantallas con un fusible corto?

Puede escuchar la NSNotification llamada @ "com.apple.screensaver.didstart" si necesita realizar reinicios o limpiezas cuando el usuario se aleja.

Editar: También podría configurar el protector de pantalla; espere a que se dispare, y luego haga lo suyo cuando comience, deteniendo el protector de pantalla cuando muestre sus propios videos; pero configurar un protector de pantalla de la manera correcta es probablemente una buena idea.

+0

que sería grande si hay en cualquier buenos protectores de pantalla con la funcionalidad que estoy buscando, tengo que poner algo de información personalizada en el video de mi aplicación, etc :( – tobros91

+0

Vas a tener que construir esa funcionalidad de todos modos, también podría hacer que sea un protector de pantalla. ahorrador no es realmente tan difícil; en l al este no en la medida en que puedo ver. –

1

He encontrado una solución que utiliza el administrador de HID, esta parece ser la manera de hacerlo en Cocoa. (Hay otra solución para carbono, pero no funciona para el sistema operativo de 64 bits X.)

Citando Daniel Reese en el Dan and Cheryl's Place blog:

#include <IOKit/IOKitLib.h> 

/* 
Returns the number of seconds the machine has been idle or -1 on error. 
The code is compatible with Tiger/10.4 and later (but not iOS). 
*/ 
int64_t SystemIdleTime(void) { 
    int64_t idlesecs = -1; 
    io_iterator_t iter = 0; 
    if (IOServiceGetMatchingServices(kIOMasterPortDefault, 
            IOServiceMatching("IOHIDSystem"), 
            &iter) == KERN_SUCCESS) 
    { 
     io_registry_entry_t entry = IOIteratorNext(iter); 
     if (entry) { 
      CFMutableDictionaryRef dict = NULL; 
      kern_return_t status; 
      status = IORegistryEntryCreateCFProperties(entry, 
                 &dict, 
                 kCFAllocatorDefault, 0); 
      if (status == KERN_SUCCESS) 
      { 
       CFNumberRef obj = CFDictionaryGetValue(dict, 
                 CFSTR("HIDIdleTime")); 
       if (obj) { 
        int64_t nanoseconds = 0; 
        if (CFNumberGetValue(obj, 
             kCFNumberSInt64Type, 
             &nanoseconds)) 
        { 
         // Convert from nanoseconds to seconds. 
         idlesecs = (nanoseconds >> 30); 
        } 
       } 
       CFRelease(dict); 
      } 
      IOObjectRelease(entry); 
     } 
     IOObjectRelease(iter); 
    } 
    return idlesecs; 
} 

El código ha sido ligeramente modificada, para que se ajuste en el límite de 80 caracteres de stackoverflow.

3

Usted puede utilizar CGEventSourceSecondsSinceLastEventType

devuelve el tiempo transcurrido desde el último evento de un evento fuente de cuarzo.

/* 
To get the elapsed time since the previous input event—keyboard, mouse, or tablet—specify kCGAnyInputEventType. 
*/ 
- (CFTimeInterval)systemIdleTime 
{  
    CFTimeInterval timeSinceLastEvent = CGEventSourceSecondsSinceLastEventType(kCGEventSourceStateHIDSystemState, kCGAnyInputEventType); 
    return timeSinceLastEvent; 
} 
2

estoy ampliando la respuesta de Parag Bafna. En Qt que puede hacer

#include <ApplicationServices/ApplicationServices.h> 

double MyClass::getIdleTime() { 
    CFTimeInterval timeSinceLastEvent = CGEventSourceSecondsSinceLastEventType(kCGEventSourceStateHIDSystemState, kCGAnyInputEventType); 
    return timeSinceLastEvent; 
} 

También hay que añadir el marco a su archivo .pro:

QMAKE_LFLAGS += -F/System/Library/Frameworks/ApplicationServices.framework 
LIBS += -framework ApplicationServices 

La documentación de la función es here

Cuestiones relacionadas