Programar uma tarefa antes de dormir no Windows 7 e suspender o evento de suspensão até que a tarefa seja executada

4

Note que isto é diferente das outras questões que encontrei (pesquisei), como:

Eu usei o mesmo truque de agendar uma tarefa no evento # 42 (System, Kernel-Power, Event 42), mas o problema é que a tarefa - pelo menos no meu caso - não é executada antes < vai dormir. parece que o horário o executa e vai dormir ao mesmo tempo. se a tarefa demorar mais para executar, então a sorte é difícil.

Eu tenho um arquivo de lote que faz:

@echo off
cd /d %~dp0
taskkill /t /im skype.exe
sleep 2
taskkill /t /f /im skype.exe
sleep 1

Minha tarefa é não executada antes de ir dormir. A máquina vai dormir imediatamente quando eu posso ver os LEDs apagando e ouvir o HDD clicando em menos de 1 segundo, enquanto eu queria segurar por 3 segundos antes de ir dormir.

Parece que as tarefas iniciadas pelo agendador não estão atrasando o evento de suspensão - e há razões válidas para isso (e se sua tarefa for interrompida?) - mas, no meu caso, isso é uma chatice!

Alguém sabe de uma maneira de fazê-lo funcionar como planejado acima, mas sendo acionado pelo evento 42?

Felicidades

OBSERVAÇÃO: sei que posso criar um lote / programa / tarefa que primeiro mata o skype, aguarda e, em seguida, envia um evento Sleep, mas gostaria de poder ativá-lo usando o Evento 42. Outros usuários em algum momento fazem logon nesta máquina enquanto o Skype está sendo executado em uma conta diferente e eles a enviam para o modo de suspensão usando a entrada de suspensão normal no menu Iniciar, não um lote / programa personalizado.

NOTE2 também tentou com caminhos completos para taskkill e sleep que estão no Windows \ System32. Isso mata o Skype.exe, em seguida, aguarda por 2 segundos, em seguida, elimina com força o Skype.exe e aguarda outro segundo. Isso ocorre devido a um erro no Skype for Win 7 x64 que trava o Skype depois de acordar do modo de suspensão. em vez de esperar que a Microsoft conserte esse bug muito antigo e frustrante e tão excessivamente relatado, eu queria implementar minha própria correção.

    
por Normadize 28.03.2013 / 14:04

1 resposta

3

O evento 42 ocorre tarde demais (no final do processo, não há tempo para fazer qualquer coisa útil) porque é pretendido como uma "documentação" para diagnósticos subseqüentes, não uma notificação antes acontecer. (Eu não entendo como poderia um moderador de MSFT aconselhar isso ?)

Infelizmente, não vi uma solução funcional para o seu problema. mas tenho certeza que o Windows faz fornecer uma notificação antes do evento, embora não no log de eventos. Isso significa que você precisa criar / usar um aplicativo em segundo plano sempre em execução (~ um "daemon") que captura esta notificação pré-espera e depois faz o que você gosta.
Eu não estou ciente de uma aplicação existente que pode fazer isso, nem Eu conheço as APIs relevantes do Windows; mas até que uma resposta melhor seja fornecida, aqui estão alguns pontos de partida que podem ajudá-lo a elaborar uma solução:

  • As seguintes páginas do MSDN parecem levar a informações sobre a notificação em si: link
    link
    link
  • Se você não quer se aprofundar no C ++, então o comando start_power_monitor do A extensão TWAPI do Tcl / Tk parece promissora (veja o evento apmsuspend ). O Tcl / Tk não é um produto complexo que requer instalação e configuração, mas um executável simples e muito poderoso que, quando acoplado ao único TWAPI .dll , concorre com o PowerShell (com muito menos espaço) (embora seguramente o PowerShell também poderia lidar com o problema, apenas eu não sei os comandos / pacotes relevantes.)

ATUALIZAÇÃO:

Não há como "suspender o evento de suspensão" porque a Microsoft interrompeu PBT_APMQUERYSUSPEND que permitia isso no XP e no Vista. Em vez disso, agora diz que você não pode impedir que o usuário coloque o computador em suspensão:

Applications should respect that the user expects a certain behavior when they close the lid on their laptop or press the power button.

Apenas o evento PBT_APMSUSPEND permaneceu, após o qual

The system allows approximately two seconds for an application to handle this notification.

    
por 30.05.2013 / 16:42