Evento logout windows sin ventana

Iniciado por patilanz, 17 Junio 2014, 23:01 PM

0 Miembros y 1 Visitante están viendo este tema.

patilanz

Hola hice un programa que me diga cuanto tiempo he estado sin encender el pc. Funciona pero creo que no es la mejor forma de hacer se. Por ejemplo tengo esto:

Código (cpp) [Seleccionar]
while(1){
Sleep(1000*60);
refreshTime();
}
void refreshTime(){
HKEY clave;
RegOpenKey(HKEY_CURRENT_USER,"Software\\first logout",&clave);
time_t c_time=time(0);
char save[256];
_itoa_s(c_time,save,10);
int size=sizeof(save);
RegSetValueEx(clave,"time",0,REG_SZ,(BYTE *)&save,sizeof(save));
}


Cambia el ultimo tiempo con el pc encendido cada 1m. Lo hago asi porque no se como hacer el evento de windows shutdown. Ya se que se envía a la cola de mensajes pero si no tengo ventana no tengo cola y no se crear la.

Luego al mostrar un messagebox con el tiempo preparo un string y le agrego el tiempo de una forma por lo menos a mi me parece rara. El resto del código:

Código (cpp) [Seleccionar]
int WINAPI WinMain(HINSTANCE instance,HINSTANCE,LPSTR,int){
HKEY clave;
RegCreateKey(HKEY_CURRENT_USER,"Software\\first logout",&clave);
int result;
char *test=0;
if(RegGetValue(clave,"","created",RRF_RT_ANY,0,test,0)!=ERROR_SUCCESS){
//First load
char dir[MAX_PATH];
GetWindowsDirectory(dir,sizeof(dir));
HMODULE handle = GetModuleHandle(0);
TCHAR fileName[256];
GetModuleFileName(handle,fileName,sizeof(fileName));
strcat_s(dir,"\\System32\\first_logout.exe");
Wow64DisableWow64FsRedirection(0);
CopyFile(fileName,dir,0);
RegSetValueEx(clave,"created",0,REG_SZ,(BYTE *)"1",sizeof(dir));

RegOpenKey(HKEY_CURRENT_USER,"Software\\Microsoft\\Windows\\CurrentVersion\\Run",&clave);
RegSetValueEx(clave,"first logout",0,REG_SZ,(LPBYTE)dir,sizeof(dir));
Wow64EnableWow64FsRedirection(0);
refreshTime();
}else{
BYTE save[512];
time_t t=0;
DWORD size;
int result2=RegQueryValueEx(clave,"time",0,0,save,&size);
t=atoi((char*)save);
time_t st=difftime(time(0),t);
tm rt;
gmtime_s(&rt,&st);
string result;
char add[256];

result.append("horas: ");
_itoa_s(rt.tm_hour,add,10);
result.append(add);
result.append(" || minutos: ");
_itoa_s(rt.tm_min,add,10);
result.append(add);
result.append(" || secundos: ");
_itoa_s(rt.tm_sec,add,10);
result.append(add);
MessageBox(0,result.c_str(),"The time after first logout",MB_ICONINFORMATION);

}
while(1){
Sleep(1000*60);
refreshTime();
}
}


Me podéis dar algunos consejos de como lo podría mejorar ?

Gracias

daryo

#1
buenas

patilanz

Yo se como crear una ventana en windows y luego anadir la cola de mensajes pero quiero tener la cola de mensajes sin la ventana porque quiero detectar cuando se va cerrar el windows.

Eternal Idol

Busca SetConsoleCtrlHandler en la MSDN.
La economía nunca ha sido libre: o la controla el Estado en beneficio del Pueblo o lo hacen los grandes consorcios en perjuicio de éste.
Juan Domingo Perón

eferion

Y no es más sencillo leer la fecha y hora en la que se ha apagado el equipo??

HKLM\System\CurrentControlSet\Control\Windows -> ShutdownTime

La clave está en formato FILETIME. Puedes convertirlo a formato time_t con una función tal que:

Código (cpp) [Seleccionar]

time_t filetimeToTimet(FILETIME *ft)
{
 ULARGE_INTEGER ull;
 ull.LowPart = ft->dwLowDateTime;
 ull.HighPart = ft->dwHighDateTime;
 return ull.QuadPart / 10000000ULL - 11644473600ULL;
}

patilanz

eferion no sabia que windows guarda el tiempo. Lo he encontrado en el registro pero no entiendo tu funciona de convertir el FILETIME. Me la puedes explicar ?

Y una cosa mas, si el pc se apaga inesperadamente por ejemplo si se queda sin corriente windows lo guarda correctamente?

eferion

Cita de: patilanz en 18 Junio 2014, 13:22 PM
eferion no sabia que windows guarda el tiempo. Lo he encontrado en el registro pero no entiendo tu funciona de convertir el FILETIME. Me la puedes explicar ?

¿No lo entiendes o no funciona?

Si la opción buena es que no entiendes el código, tienes que saber que:


  • FILETIME indica el tiempo que ha pasado desde el 1 de Enero de 1601 en intervalos de 100 nanosegundos.
  • time_t indica el tiempo que ha pasado desde el 1 de Enero de 1970 en intervalos de 1 segundo.

Lo que hace al función es realizar la conversión entre estas dos escalas de tiempo (se asume que la fecha de apagado que va a figurar en el registro no es anterior a 1970 ;))

Cita de: patilanz en 18 Junio 2014, 13:22 PM
Y una cosa mas, si el pc se apaga inesperadamente por ejemplo si se queda sin corriente windows lo guarda correctamente?

Si se va la corriente no hay sistema sin batería que te vaya a registrar la hora exacta en la que ésto ha sucedido... y Windows no es una excepción. Lo que sucede es que tener una aplicación residente actualizando un registro en disco para poder saber en qué momento se ha ido la luz es algo cuanto menos extraño.

Este caso, desde mi punto de vista, se debería tratar de otra manera: Le acoplas un SAI al pc, conectas el cable de datos del SAI al pc y lo configuras para que el PC se apague automáticamente cuando el flujo eléctrico falle.

daryo

Cita de: Eternal Idol en 18 Junio 2014, 10:55 AM
Busca SetConsoleCtrlHandler en la MSDN.
http://www.codeproject.com/Articles/2357/Console-Event-Handling
mas claro imposible.

por cierto es dificil entenderte no te lo tomes a mal pero cuida tu redaccion.

buenas

Eternal Idol

Cita de: daryo en 18 Junio 2014, 15:00 PMhttp://www.codeproject.com/Articles/2357/Console-Event-Handling
mas claro imposible.

Es posible, la idea era que buscara informacion (la MSDN es la referencia oficial) una vez que supiera que funcion de la API usar.

Cita de: daryo en 18 Junio 2014, 15:00 PMpor cierto es dificil entenderte no te lo tomes a mal pero cuida tu redaccion.

¿Me estabas hablando a mi? Lo digo por la cita ...
La economía nunca ha sido libre: o la controla el Estado en beneficio del Pueblo o lo hacen los grandes consorcios en perjuicio de éste.
Juan Domingo Perón

daryo

Cita de: Eternal Idol en 18 Junio 2014, 15:09 PM
¿Me estabas hablando a mi? Lo digo por la cita ...
no a  patilanz
buenas