Pergunta

Eu escrevi um aplicativo C# Windows Forms, não um serviço (ele é usado apenas quando o usuário está conectado e possui uma interface gráfica do usuário) que possui um thread em segundo plano em execução em um loop infinito.

Quando tento desligar o Windows (7), no entanto, ele me diz que o programa está impedindo que ele desligasse ou faça login e me pergunta se eu quero forçar um desligamento.

Agora, existe alguma possibilidade para o meu programa perceber (obter um manipulador) do Windows tentando desistir ou fazer logoff?

Então, o que eu preciso é fazer com que o aplicativo perceba quando o Windows tenta sair.

Desde já, obrigado.

EDIT: Obrigado pelo ótimo conselho! É de alguma forma possível usar a ideia com o evento de fechamento de formulário se tiver um manipulador de eventos Cancel?

Foi útil?

Solução

public Form1()
{
    InitializeComponent();

    this.FormClosing += new FormClosingEventHandler(Form1_FormClosing);
}

void Form1_FormClosing(object sender, FormClosingEventArgs e)
{
    // Or any of the other reasons suitable for what you want to accomplish
    if (e.CloseReason == CloseReason.WindowsShutDown)
    {
        //Stop your infinite loop
    }
}

Outras dicas

Você chama esse tópico de "tópico de fundo", mas ele tem IsBackground = true; ?
O sistema apenas interromperá um encadeamento que faz.

Eu penso Capture Console Sair C# Também deve ser utilizável em seu cenário.

Além disso, talvez seja suficiente configurar seu tópico como Tópico de fundo?

Dê uma olhada no Microsoft.win32.systemevents.sessioning evento.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top