Ir para conteúdo
Fórum Script Brasil
  • 0

Hibernação


Paulo Nobre

Pergunta

Gostaria de saber como, via programação, poderia saber se o computador vai hibernar.

Mais objetivamente: tenho um programa que tem um timer.

Gostaria que o programa ao perceber que o computador vai hibernar desative este timer.

Isto é possível?

Link para o comentário
Compartilhar em outros sites

  • Respostas 67
  • Created
  • Última resposta

Top Posters For This Question

Posts Recomendados

  • 0

Paulo, coloca aí um procedimento:

procedure Hiber(var Msg: TWMPower); message WM_POWERBROADCAST;

o campo PowerEvt vai ser igual a PBT_APMQUERYSUSPEND, nesse procedimento desligue seu timer e coloque o campo result para true. Acho que é isso.

Bom, a menssagem por si só é WM_POWERBROADCAST com wParam igual a PBT_APMQUERYSUSPEND.

Link para o comentário
Compartilhar em outros sites

  • 0

Bom Paulo, eu não testei porque não estou com o Delphi aqui, mas acho que ficaria mais ou menos assim ->

uses messages;

type
  TForm1 = class(TForm)
  .
  .
  protected
    procedure Hiber(var Msg: TWMPower); message WM_POWERBROADCAST;
  end;

implementation

procedure TForm1.Hiber(var Msg: TWMPower);
begin
  if (msg.PowerEvt = PBT_APMQUERYSUSPEND) then Timer1.enabled:=false else if (msg.PowerEvt = PBT_APMRESUMESUSPEND) then Timer1.enabled:=true;
  msg.result:=1;
end;

Acho que seria isso.

Link para o comentário
Compartilhar em outros sites

  • 0

Thales, aparece um erro com a mensagem:

Undeclared identifier: PBT_APMQUERYSUSPEND.

Na unit Messages ele não aparece.

O que aparece lá são os abaixo:

{ PWR_SUSPENDREQUEST, PWR_SUSPENDRESUME, PWR_CRITICALRESUME }

Mas, não sei o significado e não estou sabendo usar.

A propósito existiu algum motivo para você colocar a procedure em protected

e não em private?

Tentei pesquisar na Internet, mas não encontrei nada!

Link para o comentário
Compartilhar em outros sites

  • 0

Thales,

Como mencionado num post acima com o código fornecido não compila.

Thales, aparece um erro com a mensagem:

Undeclared identifier: PBT_APMQUERYSUSPEND.

Na unit Messages ele não aparece.

O que aparece lá são os abaixo:

{ PWR_SUSPENDREQUEST, PWR_SUSPENDRESUME, PWR_CRITICALRESUME }

No delphi 7 não está compilando!!

PBT_APMQUERYSUSPEND = 0

PBT_APMRESUMESUSPEND = 7

Vou substituir pelos valores acima!

Mas porque raios queres desliguar esse Timer?

É o seguinte, o timer controla um cronômetro regresssivo que controla uma ação.

Quando o computador hiberna o cronômetro, visualmente, congela, mas o timer continua.

Sendo assim se faltavam 2 minutos para uma ação, no cronômetro, antes de hibernar

faltavam 2 minutos no cronômetro, mas ao voltar da hibernação faltam 2 minutos para

ação no cronômetro, mas não no timer, que zerou.

Entendeu?

Link para o comentário
Compartilhar em outros sites

  • 0

O que eu quis dizer é que, PBT_APMQUERYSUSPEND é uma constante, ao invés de você colocar o identificador da constante que é PBT_APMQUERYSUSPEND, você coloca o valor dessa constante que é 0 nesse caso. Certo?

Link para o comentário
Compartilhar em outros sites

  • 0

Thales, você é mais rápido do que um raio.

Logo depois que postei, veio a luz, substitui o post e quando repostei você já havia respondido.

Deu certo!

Obrigado!!

PS: Em qual documentação estes identificadores aparecem?

Na unit Messages elas não aparem.

Link para o comentário
Compartilhar em outros sites

  • 0

Thales, deu certo(leia o post acima do seu último, por favor!).

Coloquei um showmessage(' Vou hibernar') antes e um showmessage(' Estou saindo da hibernação')

depois.

Funcionou perfeitamente.

Agora vou adaptar para o programa e é claro esta mensagens não vão aparecer e sim as ações é que deverão ocorrer.

PBT_APMQUERYSUSPEND = 0

PBT_APMRESUMESUSPEND = 7

Em qual documentação estes identificadores aparecem?

Link para o comentário
Compartilhar em outros sites

  • 0

Beleza, faça todos os testes pra ver se funciona direitinho, qualquer coisa por favor avise. Nunca fiz isso antes e também tenho curiosidade de saber o que acontece. Vou dar uma olhada pra ver onde essas constantes são declaradas e posto mais tarde.

Paulo, no meu aqui elas estão declaradas na unit Windows, mas pode ser que no seu não estejam porque nas versões anteriores do windows era utilizada uma mensagem diferente para essa ocasião, e como você usa o Delphi 7 e eu o Delphi 2006, é possivel que o delphi 2006 contenha constantes para as versões mais atuais do windows.

Link para o comentário
Compartilhar em outros sites

  • 0

Ok!,

Havia procurado na internet sobre o tema hibernação com delphi e não encontrei nada.

Coloquei a pergunta em alguns fóruns e nínguém se quer teve nehuma idéia.

Porém, aqui foi bem rápido.

Link para o comentário
Compartilhar em outros sites

  • 0

No post acima do seu respondi.

Coloquei a pergunta em alguns fóruns e nínguém se quer teve nehuma idéia.

você perguntou em outros fórums, mas você tem que perguntar primeiro aqui, porque se não me engano aqui é um dos melhores fórums do Brasil.

E eu não escreví logo todo o código no primeiro post porque agente tem que aumentar o nosso número de posts de alguma maneira :lol: .

E também existe uma função para fazer com que o computador hiberne. Não lembro o nome de cabeça mas se estiver interessado eu posso olhar pra você.

Link para o comentário
Compartilhar em outros sites

  • 0

Paulo, no meu aqui elas estão declaradas na unit Windows, mas pode ser que no seu não estejam porque nas versões anteriores do windows era utilizada uma mensagem diferente para essa ocasião, e como você usa o Delphi 7 e eu o Delphi 2006, é possivel que o delphi 2006 contenha constantes para as versões mais atuais do windows.

De fato no Delphi 7 não existem estas declarações.

Será que

{ PWR_SUSPENDREQUEST, PWR_SUSPENDRESUME, PWR_CRITICALRESUME }

encontradas na unit messages é que controlam a hibernação?

Na unit messages do Delphi 7, tem:

TWMPower = packed record
    Msg: Cardinal;
    PowerEvt: Longint; { PWR_SUSPENDREQUEST, PWR_SUSPENDRESUME,
                         PWR_CRITICALRESUME }
    Unused: Longint;
    Result: Longint;
  end;

Mas, o que importa é que com o que você me passou o problema está resolvido!

Link para o comentário
Compartilhar em outros sites

  • 0
De fato no Delphi 7 não existem estas declarações.

Será que

{ PWR_SUSPENDREQUEST, PWR_SUSPENDRESUME, PWR_CRITICALRESUME }

encontradas na unit messages é que controlam a hibernação?

Com certeza. Essas são as constantes usadas pela mensagem anteriormente usada, a WM_POWER, que se tornou obsoleta, vindo a ser substituída pela WM_POWERBROADCAST.

Link para o comentário
Compartilhar em outros sites

  • 0

Hoje em dia quase todos os computadores tem a possibilidade de hibernar, não é?

Mas, isto (hibernar) depende do hardware não é?

Sendo assim uma função deste tipo teria que interagir com hardware?

Falei alguma idiotice?

Link para o comentário
Compartilhar em outros sites

  • 0

Não depende do hardware, é uma função do windows mesmo. Aí vai o significado dos parametros->

1 - true hiberna, false dorme.

2 - true para o sistema imediatamente, false manda essa mensagem para os programas para que eles tomem as devidas providencias.

3 - true o sistema disabilita todos os eventos de Wake, false ele não o faz.

Link para o comentário
Compartilhar em outros sites

  • 0

Opa Paulo, a função está numa dll do windows chamada powrprof.dll, então use assim->

function setsuspendstate(a,b,c:boolean) : integer; external 'powrprof.dll' name 'SetSuspendState';

procedure TForm1.Button1Click(Sender: TObject);
begin
  SetSuspendState(true,false,true);

end;

Link para o comentário
Compartilhar em outros sites

  • 0

Thales, veja o que aconteceu:

o botão que chama a função passada por você está no mesmo programa(teste) onde havia

colocado seu código anterior, que funciona normalmente.

Como havia mencionado anteriormente, apenas para ter uma menssagem, coloquei

showmessage(' vou hibernar') ao entrar na hibernação e showmessage(' estou saindo da hibernação')

na volta dela. Tudo acontecia normalmente.

Agora ao clicar no botão o computador hiberna direto não aparece a mensagem(vou hibernar) e na volta o programa que está aberto, naturalmente, apresenta erro de acesso de violação, damdo f8 ele continua e aparece a mensagem ' estou saindo da hibernação'.

Você sabe porque isto acontece?

Um código incompatibiliza o outro?

Link para o comentário
Compartilhar em outros sites

  • 0

Aqui também deu erro de Access Violation, pensei que fosse por causa que estivesse rodando diretamente do Delhpi (sessão de debug ativa). você tentou rodar independentemente do Delphi?

E quanto a ele não mostrar a mensagem (hibernando), é porque a mensagem não é enviada ao próprio programa que solicitou a suspenção, somente é enviada quando é retomada a execução.

Link para o comentário
Compartilhar em outros sites

Participe da discussão

Você pode postar agora e se registrar depois. Se você já tem uma conta, acesse agora para postar com sua conta.

Visitante
Responder esta pergunta...

×   Você colou conteúdo com formatação.   Remover formatação

  Apenas 75 emoticons são permitidos.

×   Seu link foi incorporado automaticamente.   Exibir como um link em vez disso

×   Seu conteúdo anterior foi restaurado.   Limpar Editor

×   Você não pode colar imagens diretamente. Carregar ou inserir imagens do URL.




  • Estatísticas dos Fóruns

    • Tópicos
      152k
    • Posts
      651,7k
×
×
  • Criar Novo...