Detener la aplicación cuando el usuario inicia una operación de cierre de sesión / apagado

Tengo esta aplicación (aplicación de formulario de Windows escrita en Visual C ++) de un colega mío y me enfrento a algunos problemas graves. La aplicación no es un servicio ni una aplicación normal, quiero decir que tiene una GUI pero la mayoría de las veces se ejecuta en segundo plano (debería reaccionar como un servicio pero no lo es). Esta aplicación impide que el usuario cierre la sesión y necesito poder hacerlo.

Sé que Windows envía el WM_QUERYENDSESSION mensaje a todas las aplicaciones en ejecución cuando el usuario intenta cerrar la sesión. He intentado captar este mensaje en mi WndProc() función y para matar la aplicación por la fuerza, pero solo funciona una vez. Cuando vuelvo a iniciar sesión e intento cerrar la sesión, la operación no finaliza porque mi aplicación no se cierra.

Si trato de usar SessionEnding evento, la aplicación solo se coloca en la bandeja del sistema y permanece allí sin cerrar la sesión, pero esto creo que es porque el Form_Closing El método realiza esta operación en lugar de cerrar el programa (este era el requisito y no puedo cambiar eso).

Quizás otra información útil es que la aplicación se inicia automáticamente porque tiene una entrada en el HKLM registro y siempre hay 2 instancias de esta aplicación ejecutándose (una debe supervisar la otra y reiniciarla en caso de falla, pero no en caso de cierre "manual").

Cualquier sugerencia será bien recibida.

Gracias.

preguntado el 08 de noviembre de 11 a las 12:11

3 Respuestas

SetConsoleCtrlHandler puede proporcionar la solución a medida que se generan eventos cuando el usuario cierra la sesión y cuando el sistema se apaga.

respondido 08 nov., 11:16

Sí, este problema se debe al controlador de eventos FormClosing del formulario. usted tener prestar atención a la razón cercana y , de manera cancelarlo cuando el usuario está cerrando la ventana. Como esto:

    System::Void Form1_FormClosing(System::Object^  sender, System::Windows::Forms::FormClosingEventArgs^  e) {
        // Do this *only* when the user closes the window
        if (e->CloseReason == CloseReason::UserClosing) {
            e->Cancel = true;
            this->Hide();
            // etc...
        }
    }

respondido 08 nov., 11:17

Si tiene el control del código fuente, vuelva a implementar la segunda instancia (controlador) como un verdadero servicio de Windows. Haga que este monitorice la instancia de la GUI y realice las acciones de control necesarias si falla o es necesario apagarlo.

Esto le da gratis algunos de los lógica de reinicio automático que actualmente tiene que hacer manualmente, además de permitir el manejo adecuado del apagado a través de SERVICE_CONTROL_SHUTDOWN

respondido 08 nov., 11:16

No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas or haz tu propia pregunta.