Sign in to follow this  
Paulo Nobre

Hibernação

Recommended Posts

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?

Share this post


Link to post
Share on other sites

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.

Share this post


Link to post
Share on other sites

Thales,

Não consegui montar o procedimento!

Não consigo encaixar os parâmetros na posição certa.

Pode escrever o código da procedure para mim?

Share this post


Link to post
Share on other sites

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.

Share this post


Link to post
Share on other sites

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!

Share this post


Link to post
Share on other sites

PBT_APMQUERYSUSPEND = 0

PBT_APMRESUMESUSPEND = 7

O protected aí não tem nada a ver não, pode ser no private mesmo.

Mas porque raios queres desliguar esse Timer?

Share this post


Link to post
Share on other sites

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?

Share this post


Link to post
Share on other sites

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?

Share this post


Link to post
Share on other sites

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.

Share this post


Link to post
Share on other sites

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?

Share this post


Link to post
Share on other sites

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.

Share this post


Link to post
Share on other sites

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.

Share this post


Link to post
Share on other sites

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ê.

Share this post


Link to post
Share on other sites

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!

Share this post


Link to post
Share on other sites
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.

Share this post


Link to post
Share on other sites

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ê.

Claro que estou interessado!!

Share this post


Link to post
Share on other sites

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?

Share this post


Link to post
Share on other sites

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.

Share this post


Link to post
Share on other sites

Tenho que acrescentar alguma unit?

SetSuspendState(true, false, true);

Testei a função sendo chamada por um botão e não compila.

Share this post


Link to post
Share on other sites

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;

Share this post


Link to post
Share on other sites

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?

Share this post


Link to post
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

Sign in to follow this