delphi 不让用户修改系统时间 就是在程序运行时,我自动获取服务器时间将本地时间修改,但是在程序运行这段时间内不准用户修改本机时间,当退出程序时我不管用户怎么修改。给点思路啊,谢谢 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 简单的方法:在程序中设一个定时器.不断地间同步本机及服务器的时间,但这样会增加系统开销另外,你可以用第三方的组件,如:http://download.csdn.net/source/867139 开一个线程,先记住与服务器同步后的时间,再每sleep(1000)把那个时间加1秒,与系统时间对照,差异如果大于一定限制,则重新同步 设置时间也有API的,你把那个API勾住,基本上就没人能改时间了 可以截获WMTimeChange消息来做相应处理,即当触发WMTimeChange消息时,向服务器查询时间,然后调用API再把本地的时间设成服务器的时间 前不久我也问过这样的问题,处理的方法是将文件保护功能去掉,然后将timedate.cpl文件更名即可! 调用系统API函数可以实现. 根据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; 不使用本地时间才是根本的方法,方法1:只要在需要的地方通过SQL直接引用服务器时间就是了方法2:程序开始时取服务器时间,然后搞一个定时器或者取系统开机后运行了多少时间(这有一个WINDOWS函数),以后再次重复取系统开机了多少时间,一比较就可以获得正确结果了,随便他们去如何改系统的时间都没有关系!楼上很多朋友的方法,是否真能确保系统时间不被改乱呢?恐怕没有人敢保证吧! 欢迎19楼的小虫(postren)大鸟,顶一下,再啰嗦两句1、取服务器时间更新本地时间2、程序中计时,定时判断系统时间是否偏差,有偏差则更新还有另外一个思路,就是利用操作系统的校时程序,如Windows的时间同步服务 注册表方法,刚才试了一下,不可行在xp中将C:\WINDOWS\system32 下的文件cpl文件移到安全处或改名。系统中就无法修改时间了。在xp中将C:\WINDOWS\system32 下的文件cpl文件移到安全处或改名。系统中就无法修改时间了。关闭文件保护TimeDate.cpl把这个改一下名就可以限制修改系统时间了,这个我试了,可行 你是要实现数据的时间统一吧,读取服务器端的数据库系统时间就可以了,自己做个函数。或在sql中直接调用数据库的时间函数。如果单纯让客户端实现不能改变时间,还是真挺不好弄,你得确保你的程序不能非法退出,否则就不好办了。 使用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; 控制clientdataset 中的记录根据条件判断是否可修改 formatfloat 再问dll调用问题 如何把自定义结构实现数组??急救. 一个奇怪的错误 我怎样定义记录类的字段,而可以存放图片等二进制文件? 這語句錯在哪里呀? 关于Tcanvas的textrect问题 在线等待:Delphi中的TList相对C#中是什么类啊? TMD!!发现delphi的一个超级大BUG!! delphi 新手问题 工程里为什么有其他工程里的文件 如何不让窗体拖动
另外,你可以用第三方的组件,如:
http://download.csdn.net/source/867139
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;
方法1:只要在需要的地方通过SQL直接引用服务器时间就是了
方法2:程序开始时取服务器时间,然后搞一个定时器或者取系统开机后运行了多少时间(这有一个WINDOWS函数),以后再次重复取系统开机了多少时间,一比较就可以获得正确结果了,随便他们去如何改系统的时间都没有关系!楼上很多朋友的方法,是否真能确保系统时间不被改乱呢?恐怕没有人敢保证吧!
1、取服务器时间更新本地时间
2、程序中计时,定时判断系统时间是否偏差,有偏差则更新还有另外一个思路,就是利用操作系统的校时程序,如Windows的时间同步服务
在xp中将C:\WINDOWS\system32 下的文件cpl文件移到安全处或改名。系统中就无法修改时间了。
在xp中将C:\WINDOWS\system32 下的文件cpl文件移到安全处或改名。系统中就无法修改时间了。关闭文件保护
TimeDate.cpl把这个改一下名就可以限制修改系统时间了,这个我试了,可行
如果单纯让客户端实现不能改变时间,还是真挺不好弄,你得确保你的程序不能非法退出,否则就不好办了。
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;