Compartir a través de


Impedir el cierre de sesión o la suspensión durante una grabación

Si no se realizan precauciones adecuadas dentro de una aplicación, es posible que un usuario cierre sesión durante una operación de grabación. Esto provoca la interrupción del proceso de grabación, lo que puede provocar la pérdida de datos y, posiblemente, hacer que el disco no se pueda usar.

Para evitar este problema, la aplicación debe procesar el mensaje WM_QUERYENDSESSION que se entrega antes de cerrar sesión. Si la aplicación recibe este mensaje mientras se realiza una operación de grabación, devuelva FALSE para cancelar el procedimiento de cierre de sesión. Si la aplicación permite al usuario decidir si desea continuar cerrando sesión, se debe proporcionar una advertencia que indique que el usuario perderá datos.

Las transiciones de energía durante el proceso de grabación también pueden crear posibles problemas en el éxito de una actividad de grabación. La prevención de estas complicaciones durante el proceso de grabación requiere que una aplicación tenga en cuenta cuándo se realizan las transiciones de energía. Esto se logra al permitir que la aplicación procese el mensaje de WM_POWERBROADCAST. Las aplicaciones desarrolladas para Windows XP o Windows Server 2003 pueden devolver BROADCAST_QUERY_DENY en respuesta a PBT_APMQUERYSUSPEND, lo que impide suspender durante el proceso de grabación.

Debido a los cambios en el modelo de administración de energía para Windows Vista y Windows Server 2008, el evento PBT_APMQUERYSUSPEND ya no se entrega a las aplicaciones. En su lugar, se entrega el evento PBT_APMSUSPEND, lo que proporciona dos segundos para que una aplicación se prepare para la transición.

Como resultado de estos cambios, se recomienda que las aplicaciones llamen a la función SetThreadExecutionState para evitar un tiempo de espera de inactividad del sistema que normalmente da lugar a la transición a Suspender. Es importante recordar que llamar a esta función con las marcas adecuadas establecidas solo impedirá que el sistema esté inactivo, no una suspensión en curso.

Usar IMAPI

SetThreadExecutionState