Ver Mensaje Individual
  #7  
Antiguo 25-08-2004
Avatar de roman
roman roman is offline
Moderador
 
Registrado: may 2003
Ubicación: Ciudad de México
Posts: 20.269
Reputación: 10
roman Es un diamante en brutoroman Es un diamante en brutoroman Es un diamante en bruto
Se me ocurre algo aunque no sé qué tan viable sea o si es lo óptimo.

En el programa que tú hagas comienzas tomando la hora apenas inicie (y el programa habrá que iniciarlo al comenzar Windows). Lo más cómodo es con

Código Delphi [-]
StartTime := Time();
StartTicks := GetTickCount();

GetTickCount te dá el número de milisegundos desde que inicia Windows.

Con una componente Timer checas cada x segundos el tiempo transcurrido

Código Delphi [-]
procedure TForm1.Timer1OnTimer(Sender: TObject);
var
  TicksElapsed: Cardinal;
  TimeElapsed: Cardinal;

begin
  TicksElapsed := GetTickCount() - StartTicks;
  TimeElapsed := MiliSecondsBetween(Time() - StartTime);

  if (Abs(TicksElapsed - TimeElapsed) > MinAllowed) then
    ShowMessage('Usted ha alterado la hora del sistema');
end;

Lo estoy escribiendo como se me ocurre y sin probar así que quizá algo no esté correcto pero la idea es esta:

Tu programa mide cada x tiempo el número de milisegundos que han transcurrido desde que inicio la sesión de Windows. Este valor debe coincidir (o acercarse mucho) al número de milisegundos entre la hora de inicio y la hora actual, y dejará de ser así si se cambia la hora de la pc.

Aquí estoy suponiendo que el valor de GetTickCount no se afecta al cambiar la hora de la máquina, es decir, que no depende del reloj de ésta. Creo que así es pero si no podrías usar algo como QueryPerformanceCount que se basa en los ciclos del procesador y no en el reloj.

Así, aun cuando no estás bloqueando propiamente el cambio de hora, sí podrías detectar si alguien la cambia.

// Saludos
Responder Con Cita