就是在程序运行时,我自动获取服务器时间将本地时间修改,但是在程序运行这段时间内不准用户修改本机时间,当退出程序时我不管用户怎么修改。给点思路啊,谢谢

解决方案 »

  1.   

    简单的方法:在程序中设一个定时器.不断地间同步本机及服务器的时间,但这样会增加系统开销
    另外,你可以用第三方的组件,如:
    http://download.csdn.net/source/867139
      

  2.   

    开一个线程,先记住与服务器同步后的时间,再每sleep(1000)把那个时间加1秒,与系统时间对照,差异如果大于一定限制,则重新同步
      

  3.   

    设置时间也有API的,你把那个API勾住,基本上就没人能改时间了
      

  4.   

    可以截获WMTimeChange消息来做相应处理,即当触发WMTimeChange消息时,向服务器查询时间,然后调用API再把本地的时间设成服务器的时间
      

  5.   

    前不久我也问过这样的问题,处理的方法是将文件保护功能去掉,然后将timedate.cpl文件更名即可!
      

  6.   

    调用系统API函数可以实现.
      

  7.   

    根据GetTickCount计算当前时间
    var
      dwBgnTick: DWORD;
      dtBgnTime: TDateTime;procedure TForm1.FormCreate(Sender: TObject);
    begin
      // 自动获取服务器时间将本地时间修改后保存
      dwBgnTick := GetTickCount;   // 保存起始Tick
      dtBgnTime := Now;            // 保存起始时间
    end;// 定时器检查是否修改了系统时间
    procedure TForm1.Timer1Timer(Sender: TObject);
    var
      dwDelta: DWORD;
      dtNowTime: TDateTime;
    begin
      dwDelta := GetTickCount - dwBgnTick;
      dtNowTime := dtBgnTime + dwDelta / 86400000.0;
      Label1.Caption := FormatDateTime('YYYY-MM-DD HH:NN:SS.ZZZ', dtNowTime);
      if Abs(dtNowTime - Now) > 1 / 86400.0 then   // 时间差大于1秒认为修改了系统时间
        Label2.Caption := 'time change'
      else
        Label2.Caption := 'time not changed';
    end;
      

  8.   

    不使用本地时间才是根本的方法,
    方法1:只要在需要的地方通过SQL直接引用服务器时间就是了
    方法2:程序开始时取服务器时间,然后搞一个定时器或者取系统开机后运行了多少时间(这有一个WINDOWS函数),以后再次重复取系统开机了多少时间,一比较就可以获得正确结果了,随便他们去如何改系统的时间都没有关系!楼上很多朋友的方法,是否真能确保系统时间不被改乱呢?恐怕没有人敢保证吧!
      

  9.   

    欢迎19楼的小虫(postren)大鸟,顶一下,再啰嗦两句
    1、取服务器时间更新本地时间
    2、程序中计时,定时判断系统时间是否偏差,有偏差则更新还有另外一个思路,就是利用操作系统的校时程序,如Windows的时间同步服务
      

  10.   

    注册表方法,刚才试了一下,不可行
    在xp中将C:\WINDOWS\system32 下的文件cpl文件移到安全处或改名。系统中就无法修改时间了。
    在xp中将C:\WINDOWS\system32 下的文件cpl文件移到安全处或改名。系统中就无法修改时间了。关闭文件保护
    TimeDate.cpl把这个改一下名就可以限制修改系统时间了,这个我试了,可行
      

  11.   

    你是要实现数据的时间统一吧,读取服务器端的数据库系统时间就可以了,自己做个函数。或在sql中直接调用数据库的时间函数。
    如果单纯让客户端实现不能改变时间,还是真挺不好弄,你得确保你的程序不能非法退出,否则就不好办了。
      

  12.   

    使用SetSystemTime, 
    var 
    a:_SYStemTIME;//部分参数可忽略,如下 
    begin 
        a.wYear   :=   2000; 
        a.wDay   :=   8; 
        a.wHour   :=   10; 
        a.wMonth   :=   6; 
        a.wMinute   :=19; 
        a.wMilliseconds   :=   20; 
        setsystemtime(a); 
    end; _SYStemTIME结构: 
    typedef   struct   _SYSTEMTIME   {         
            WORD   wYear;   //年 
            WORD   wMonth;   //月 
            WORD   wDayOfWeek;   //星期 
            WORD   wDay;   //日 
            WORD   wHour;   //小时 
            WORD   wMinute;   //分 
            WORD   wSecond;   //秒 
            WORD   wMilliseconds;//毫秒   
    }   SYSTEMTIME;