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