Paulo Nobre Postado Outubro 11, 2006 Denunciar Share Postado Outubro 11, 2006 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? Citar Link para o comentário Compartilhar em outros sites More sharing options...
0 Thales Pontes Martins Postado Outubro 11, 2006 Denunciar Share Postado Outubro 11, 2006 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. Citar Link para o comentário Compartilhar em outros sites More sharing options...
0 Paulo Nobre Postado Outubro 11, 2006 Autor Denunciar Share Postado Outubro 11, 2006 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? Citar Link para o comentário Compartilhar em outros sites More sharing options...
0 Thales Pontes Martins Postado Outubro 11, 2006 Denunciar Share Postado Outubro 11, 2006 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. Citar Link para o comentário Compartilhar em outros sites More sharing options...
0 Paulo Nobre Postado Outubro 12, 2006 Autor Denunciar Share Postado Outubro 12, 2006 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 protectede não em private?Tentei pesquisar na Internet, mas não encontrei nada! Citar Link para o comentário Compartilhar em outros sites More sharing options...
0 Thales Pontes Martins Postado Outubro 12, 2006 Denunciar Share Postado Outubro 12, 2006 PBT_APMQUERYSUSPEND = 0PBT_APMRESUMESUSPEND = 7O protected aí não tem nada a ver não, pode ser no private mesmo.Mas porque raios queres desliguar esse Timer? Citar Link para o comentário Compartilhar em outros sites More sharing options...
0 Paulo Nobre Postado Outubro 12, 2006 Autor Denunciar Share Postado Outubro 12, 2006 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 = 0PBT_APMRESUMESUSPEND = 7Vou 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? Citar Link para o comentário Compartilhar em outros sites More sharing options...
0 Thales Pontes Martins Postado Outubro 12, 2006 Denunciar Share Postado Outubro 12, 2006 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? Citar Link para o comentário Compartilhar em outros sites More sharing options...
0 Paulo Nobre Postado Outubro 12, 2006 Autor Denunciar Share Postado Outubro 12, 2006 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. Citar Link para o comentário Compartilhar em outros sites More sharing options...
0 Thales Pontes Martins Postado Outubro 12, 2006 Denunciar Share Postado Outubro 12, 2006 Mas você tentou hibernar pra ver se o resultado foi o esperado? Citar Link para o comentário Compartilhar em outros sites More sharing options...
0 Paulo Nobre Postado Outubro 12, 2006 Autor Denunciar Share Postado Outubro 12, 2006 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 = 0PBT_APMRESUMESUSPEND = 7Em qual documentação estes identificadores aparecem? Citar Link para o comentário Compartilhar em outros sites More sharing options...
0 Thales Pontes Martins Postado Outubro 12, 2006 Denunciar Share Postado Outubro 12, 2006 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. Citar Link para o comentário Compartilhar em outros sites More sharing options...
0 Paulo Nobre Postado Outubro 12, 2006 Autor Denunciar Share Postado Outubro 12, 2006 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. Citar Link para o comentário Compartilhar em outros sites More sharing options...
0 Thales Pontes Martins Postado Outubro 12, 2006 Denunciar Share Postado Outubro 12, 2006 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ê. Citar Link para o comentário Compartilhar em outros sites More sharing options...
0 Paulo Nobre Postado Outubro 12, 2006 Autor Denunciar Share Postado Outubro 12, 2006 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! Citar Link para o comentário Compartilhar em outros sites More sharing options...
0 Thales Pontes Martins Postado Outubro 12, 2006 Denunciar Share Postado Outubro 12, 2006 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. Citar Link para o comentário Compartilhar em outros sites More sharing options...
0 Paulo Nobre Postado Outubro 12, 2006 Autor Denunciar Share Postado Outubro 12, 2006 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!! Citar Link para o comentário Compartilhar em outros sites More sharing options...
0 Thales Pontes Martins Postado Outubro 12, 2006 Denunciar Share Postado Outubro 12, 2006 SetSuspendState(true, false, true);isso põe o computador para hibernar. Citar Link para o comentário Compartilhar em outros sites More sharing options...
0 Paulo Nobre Postado Outubro 12, 2006 Autor Denunciar Share Postado Outubro 12, 2006 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? Citar Link para o comentário Compartilhar em outros sites More sharing options...
0 Thales Pontes Martins Postado Outubro 12, 2006 Denunciar Share Postado Outubro 12, 2006 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. Citar Link para o comentário Compartilhar em outros sites More sharing options...
0 Paulo Nobre Postado Outubro 12, 2006 Autor Denunciar Share Postado Outubro 12, 2006 Tenho que acrescentar alguma unit?SetSuspendState(true, false, true);Testei a função sendo chamada por um botão e não compila. Citar Link para o comentário Compartilhar em outros sites More sharing options...
0 Thales Pontes Martins Postado Outubro 12, 2006 Denunciar Share Postado Outubro 12, 2006 :D hehe, também não consegui compilar, deveria estar na unit Windows, mas não está. Vou dar uma pesquisada e posto mais tarde. Foi mal. Citar Link para o comentário Compartilhar em outros sites More sharing options...
0 Paulo Nobre Postado Outubro 12, 2006 Autor Denunciar Share Postado Outubro 12, 2006 Ok! Citar Link para o comentário Compartilhar em outros sites More sharing options...
0 Thales Pontes Martins Postado Outubro 12, 2006 Denunciar Share Postado Outubro 12, 2006 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; Citar Link para o comentário Compartilhar em outros sites More sharing options...
0 Paulo Nobre Postado Outubro 12, 2006 Autor Denunciar Share Postado Outubro 12, 2006 Thales, veja o que aconteceu:o botão que chama a função passada por você está no mesmo programa(teste) onde haviacolocado seu código anterior, que funciona normalmente.Como havia mencionado anteriormente, apenas para ter uma menssagem, coloqueishowmessage(' 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? Citar Link para o comentário Compartilhar em outros sites More sharing options...
0 Thales Pontes Martins Postado Outubro 12, 2006 Denunciar Share Postado Outubro 12, 2006 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. Citar Link para o comentário Compartilhar em outros sites More sharing options...
Pergunta
Paulo Nobre
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
Top Posters For This Question
34
29
2
1
Dias Populares
Out 12
42
Out 13
11
Out 20
4
Out 19
4
Top Posters For This Question
Thales Pontes Martins 34 posts
Paulo Nobre 29 posts
Progr'amador 2 posts
Lukoso 1 post
Dias Populares
Out 12 2006
42 posts
Out 13 2006
11 posts
Out 20 2006
4 posts
Out 19 2006
4 posts
67 respostass a esta questão
Posts Recomendados
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.