Mi aplicación Cocoa ejecuta tareas en segundo plano, que me gustaría detener cuando el usuario permanezca inactivo (sin entrada de teclado/mouse) y luego reanudar cuando el usuario se active nuevamente. ¿Hay alguna forma de registrarse para notificaciones de estado inactivo?Objetivo C: recibir notificaciones sobre el estado inactivo de un usuario
Respuesta
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
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).
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
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. –
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>
).
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.
- 1. ¿Cómo recibir notificaciones sobre el cambio de estado de la red wifi?
- 2. objetivo c - Detectar cuando el usuario cambia la configuración de notificaciones de la aplicación
- 3. ¿Cómo puedo recibir notificaciones sobre un cambio de horario del sistema en mi aplicación Cocoa?
- 4. C# Durante cuánto tiempo estuvo inactivo el usuario
- 5. ¿Cómo recibir notificaciones sobre la implementación de EJB (para configurar un temporizador)?
- 6. Recibir notificaciones cuando el usuario presiona "Buscar" en el teclado en UISearchDisplayController
- 7. detección de estado inactivo Silverlight 4 aplicación
- 8. Recibir notificaciones con la aplicación en el modo de fondo
- 9. ¿Cómo recibir notificaciones de MonoTouch sobre mi solicitud cerrada/enviada a segundo plano?
- 10. ¿Cómo recibir notificaciones de una vista emergente en UINavigationController?
- 11. iOS: cómo registrarse para recibir notificaciones push?
- 12. ¿Cómo recibir notificaciones cuando cambia la altura de la barra de estado?
- 13. comprobando el estado del usuario (activo, inactivo) en una página web
- 14. Recibir notificaciones push en PhoneGap para iOS
- 15. Objetivo-c: ¿beneficios de usar NSCache sobre un NSMutableDictionary estático?
- 16. ¿Cómo recibir notificaciones automáticas de mi cuenta de Gmail?
- 17. Recibir notificaciones cuando se reproduce un sonido en OpenAL
- 18. Mantener el estado de usuario en Android
- 19. ¿Hay alguna manera de recibir notificaciones de cambios de fecha en C#?
- 20. ¿Cómo puedo recibir notificaciones cuando se visualice UIView?
- 21. Algunas preguntas sobre notificaciones push?
- 22. ¿cómo recibir notificaciones de cambio de volumen de medios?
- 23. Objetivo C: recibir una notificación cuando se llame a un método
- 24. knockoutjs: cómo recibir notificaciones para todas las propiedades una vez
- 25. ¿Cómo recibir notificaciones para eventos de tarjetas SD?
- 26. Recibir notificaciones cuando la aplicación actual cambie en Cocoa
- 27. Notificaciones push de Apple: al registrarse para recibir notificaciones, no se reciben devoluciones de llamadas
- 28. ¿Cómo evitar que Windows entre en estado inactivo?
- 29. Cómo personalizar los colores de texto seleccionados de un NSTextField/NSTextView en un estado inactivo
- 30. Ajuste del objetivo C en el objetivo C++/C++
Edición pequeña, entrada = IOIteratorNext (nivel) debe ser entry = IOIteratorNext (iter). – Shaun
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). –