Club Delphi  
    FTP   CCD     Buscar   Trucos   Trabajo   Foros

Retroceder   Foros Club Delphi > Principal > API de Windows
Registrarse FAQ Miembros Calendario Guía de estilo Temas de Hoy

Respuesta
 
Herramientas Buscar en Tema Desplegado
  #1  
Antiguo 23-01-2008
Wellnic Wellnic is offline
Miembro
 
Registrado: mar 2007
Posts: 68
Poder: 18
Wellnic Va por buen camino
Question Hibernar o no hibernar, he ahí el dilema

Hola, ¿cómo se puede averiguar si en Windows está activada la hibernación? Hasta ahora lo averiguo comprobando si existe el fichero "hiberfil.sys", por ejemplo:

Código Delphi [-]
...
SetString(wh, WinDir, GetWindowsDirectory(WinDir, MAX_PATH));
wh:= ExtractFileDrive(wh)+'\hiberfil.sys';
...

If FileExist(wh) Then...

Pero no me parece la manera más adecuada. Digo yo que debería haber alguna función específica para ello...
Responder Con Cita
  #2  
Antiguo 23-01-2008
[maeyanes] maeyanes is offline
Capo de los Capos
 
Registrado: may 2003
Ubicación: Campeche, México
Posts: 2.732
Poder: 24
maeyanes Va por buen camino
Hola...

Revisa la función de la API: GetPwrCapabilities

http://msdn2.microsoft.com/en-us/lib...91(VS.85).aspx


Saludos...
Responder Con Cita
  #3  
Antiguo 23-01-2008
Wellnic Wellnic is offline
Miembro
 
Registrado: mar 2007
Posts: 68
Poder: 18
Wellnic Va por buen camino
El problema es que yo utilizo una versión de Delphi muuuy antigua, la 3 (del siglo pasado, vamos) y esa función no la reconoce A lo mejor hay que añadir algún módulo...
Responder Con Cita
  #4  
Antiguo 23-01-2008
Avatar de ixMike
ixMike ixMike is offline
Miembro
 
Registrado: feb 2004
Posts: 1.151
Poder: 22
ixMike Va por buen camino
Cita:
Empezado por Wellnic Ver Mensaje
El problema es que yo utilizo una versión de Delphi muuuy antigua, la 3 (del siglo pasado, vamos) y esa función no la reconoce A lo mejor hay que añadir algún módulo...
Hombre, tampoco es para ponerse así. Usamos la misma versión . Será cuestión de probar con las típicas "uses" que tienen APIs de Windows (Windows, ShellApi, ShlObj...), pero si no dieras con ella, en el enlace te da la información suficiente como para que la puedas implementar tú mismo (me refiero la llamada a la API).


Salu2.


P.D.: Yo tengo D3 standar, ¿y tú?
Responder Con Cita
  #5  
Antiguo 24-01-2008
Wellnic Wellnic is offline
Miembro
 
Registrado: mar 2007
Posts: 68
Poder: 18
Wellnic Va por buen camino
La mía la adquirí por 995 pesetas hace unos once años, era la primera de una serie de fascículos sobre programación. Apuesto a que es tu mismo caso.

Para lo que hago es más que suficiente Y desde luego no me quejo, ni mucho menos. De hecho aún me viene grande
Responder Con Cita
  #6  
Antiguo 24-01-2008
Avatar de cHackAll
[cHackAll] cHackAll is offline
Baneado?
 
Registrado: oct 2006
Posts: 2.159
Poder: 20
cHackAll Va por buen camino
Cita:
Empezado por Wellnic
Hola, ¿cómo se puede averiguar si en Windows está activada la hibernación?
Revisa el primer comentario de éste truco.

Saludos
Responder Con Cita
  #7  
Antiguo 24-01-2008
Avatar de dec
dec dec is offline
Moderador
 
Registrado: dic 2004
Ubicación: Alcobendas, Madrid, España
Posts: 13.107
Poder: 34
dec Tiene un aura espectaculardec Tiene un aura espectacular
Hola,

Yo utilizo en cierto proyecto una función similar a esta:

Código Delphi [-]
function SystemCanHibernate(): boolean;
resourcestring
  rsDll = 'powrprof.dll';
  rsFunc = 'IsPwrHibernateAllowed';
type
  TFunc = function: boolean; stdcall;
var
  func: TFunc;
  hDll: THandle;
begin
  result := false;
  hDll := LoadLibrary(PChar(rsDll));
  if (hDll <> 0) then
  try
    @func := GetProcAddress(hDll, PChar(rsFunc));
    result := Assigned(func) and func();
  finally
    FreeLibrary(hDll);
  end;
end;

Esta otra función serviría para averiguar si el sistema puede suspenderse:

Código Delphi [-]
function SystemCanSuspend(): boolean;
resourcestring
  rsDll = 'powrprof.dll';
  rsFunc = 'IsPwrSuspendAllowed';
type
  TFunc = function: boolean; stdcall;
var
  func: TFunc;
  hDll: THandle;
begin
  result := false;
  hDll := LoadLibrary(PChar(rsDll));
  if (hDll <> 0) then
  try
    @func := GetProcAddress(hDll, PChar(rsFunc));
    result := Assigned(func) and func();
  finally
    FreeLibrary(hDll);
  end;
end;
__________________
David Esperalta
www.decsoftutils.com
Responder Con Cita
  #8  
Antiguo 24-01-2008
Avatar de cHackAll
[cHackAll] cHackAll is offline
Baneado?
 
Registrado: oct 2006
Posts: 2.159
Poder: 20
cHackAll Va por buen camino
Cita:
Empezado por dec Ver Mensaje
Yo utilizo en cierto proyecto una función similar a esta...
han usado mi truco y le han aumentado "cosas"...

Código Delphi [-]
uses Windows;
function IsPwrHibernateAllowed: LongBool; external 'powrprof.dll';
var hToken: Cardinal;
begin
 if OpenProcessToken(DWORD(-1), TOKEN_ADJUST_PRIVILEGES, hToken) then
  AdjustTokenPrivileges(hToken, False, PTokenPrivileges(PChar(#1#0#0#0#19#0#0#0#0#0#0#0#2#0#0#0))^, 16, nil, PDWORD(0)^);
 if not IsPwrHibernateAllowed then
  MessageBox(0, 'No está habilitada la hibernación del sistema!', nil, MB_ICONEXCLAMATION)
 else if not SetSystemPowerState(False, True) then
  MessageBox(0, 'No se ha podido hibernar el equipo!', nil, MB_ICONEXCLAMATION);
end.

PD: tenemos que usar más la sección de trucos.

Saludos
Responder Con Cita
  #9  
Antiguo 24-01-2008
Wellnic Wellnic is offline
Miembro
 
Registrado: mar 2007
Posts: 68
Poder: 18
Wellnic Va por buen camino
Muchas gracias. Trataré de estudiar todas estas funciones, a ver si consigo entenderlas, porque yo no me conformo con copiar y pegar
Responder Con Cita
  #10  
Antiguo 16-05-2008
Wellnic Wellnic is offline
Miembro
 
Registrado: mar 2007
Posts: 68
Poder: 18
Wellnic Va por buen camino
Estas funciones, en realidad, no siempre detectan si se puede hibernar o no. Cuando tengo el MODEM encendido, por ejemplo, no se dan por enteradas de que no se puede hibernar el ordenador.
Responder Con Cita
  #11  
Antiguo 16-05-2008
Avatar de cHackAll
[cHackAll] cHackAll is offline
Baneado?
 
Registrado: oct 2006
Posts: 2.159
Poder: 20
cHackAll Va por buen camino
Otra cosa es que cuando se inicia el proceso de hibernado en modo NO crítico, el sistema envia a todas las colas de mensajes el mensaje WM_POWERBROADCAST, con la estructura PBT_APMQUERYSUSPEND, el cual puede retornar el valor BROADCAST_QUERY_DENY para suspender el intento de hibernación. Esto no significa que las anteriores APIs no sean las adecuadas.

Saludos
Responder Con Cita
  #12  
Antiguo 17-05-2008
Wellnic Wellnic is offline
Miembro
 
Registrado: mar 2007
Posts: 68
Poder: 18
Wellnic Va por buen camino
Sin embargo entiendo que esos mensajes se producen a posteriori, cuando es un poco "demasiado tarde". En la práctica no sirve de mucho saber que no se pudo hibernar, sería más útil saber si se podrá hibernar.

Debería existir una función que lo detectara a priori en todos los casos.

Última edición por Wellnic fecha: 17-05-2008 a las 01:42:13.
Responder Con Cita
  #13  
Antiguo 17-05-2008
Avatar de cHackAll
[cHackAll] cHackAll is offline
Baneado?
 
Registrado: oct 2006
Posts: 2.159
Poder: 20
cHackAll Va por buen camino
Al cancelarse la hibernación, la API SetSystemPowerState debería retornar false ó en su defecto algún GetLastError. Me podrías comentar el resultado de mi ejemplo con tu modem activo y el valor de GetLastError luego de la llamada a dicha API en caso de cancelacion?
Responder Con Cita
  #14  
Antiguo 17-05-2008
Wellnic Wellnic is offline
Miembro
 
Registrado: mar 2007
Posts: 68
Poder: 18
Wellnic Va por buen camino
Con el MODEM activo SetSystemPowerState da false y GetLastError da 0.

(Por cierto, es un MODEM USB).
Responder Con Cita
Respuesta



Normas de Publicación
no Puedes crear nuevos temas
no Puedes responder a temas
no Puedes adjuntar archivos
no Puedes editar tus mensajes

El código vB está habilitado
Las caritas están habilitado
Código [IMG] está habilitado
Código HTML está deshabilitado
Saltar a Foro

Temas Similares
Tema Autor Foro Respuestas Último mensaje
Suspender e hibernar el pc jorgegetafe Varios 14 02-11-2007 16:15:52
Dilema marcoszorrilla La Taberna 9 21-09-2007 16:23:20
Delphi - VB : Gran Dilema jorge_mosquera OOP 1 20-03-2007 16:13:58
El gran dilema de la impresión hgiacobone Impresión 5 19-04-2005 09:28:06
Dilema Matrimonial guillotmarc Humor 4 17-05-2003 00:02:22


La franja horaria es GMT +2. Ahora son las 09:05:40.


Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Traducción al castellano por el equipo de moderadores del Club Delphi
Copyright 1996-2007 Club Delphi