禁止“修改系统时间”问题讨论(最高150分) (50分)

  • 主题发起人 主题发起人 webcom
  • 开始时间 开始时间
W

webcom

Unregistered / Unconfirmed
GUEST, unregistred user!
目前有两种方案:
1、使用WM_TIMECHANGE消息
原理:
程序运行时调用GetTickCount(该函数不受系统时间影响)记录系统已运行时间,
并记录初始系统时间,监视WM_TIMECHANGE消息,
再次调用GetTickCount取得当前系统已运行时间,根据两次的差恢复系统时间。
问题:
1)怎样计算出新时间 2)会造成无限循环
2、使用HOOK(钩子)技术
问题:
我不会用HOOK!

时限:2002.03.29以前
谁能用HOOK解决问题,另加100分(请留下Email,验证后,将通知新开贴子拿分!)
 
好像不太现实,要是改CMOS时间呢?
 
>> 1)怎样计算出新时间 2)会造成无限循环
你是不是作成服务形式的(或伺服器)?? 的确会造成循环!

但是可以用个控制变量啊~
>> 并记录初始系统时间,监视WM_TIMECHANGE消息,
此时设置控制变量为真(初始化为假), 等修改过后,复系统时间,再设置为假!
理论上不会循环的!
--------------
关注!
 
只要保证在我的程序运行期间禁止“修改系统时间”就行了,其他时间不管!
 
对于你这个问题,我的理解是你想做一个记数器,程序运行时有一个时间限制,对不对?
如果这样的话,很好搞定,用一个timer,在timer的事件中计数就是了,换成时间应该很容易吧!
 
好问题!!
我也有同样的问题!
有大案的话,能一起分享吗???
 
其實這個問題你不要想得太嚴重,用Windwos本身的注冊表功能來實現就很好了,你如果用的
是Windows2000那麼如果你搞的用戶是受限制的那他不就不可以休改了麼?如果不是的話那你
同樣可以通過休改注冊表來實現啊!如果你不想讓人家知道你修改了注冊表那麼你就用Delphi
寫一個修改注冊表的程式不就行了嗎?
我做過,完全沒問題,而且一次除根,不必每次開機都運行你那個程式,只有用我的程式才能恢復!
 
对于第一个方案
新时间可以取数据库服务器的时间或用net time //servername
或干脆自己做一个时间服务器,走socket传时间。
 
sydanlong:
1、我的程序的运行环境为 Win9X/ME
2、怎样修改注冊表
3、如果可行的的话,给你加分了
 
同寫了我大半天一不小心就沒了.唉!
等等吧!我只好再寫一次了
 
做时间服务器只能取得服务器的时间,用来是保持client与server同步
单机怎么用时间服务器呢? 不明白@!!
注意是这样要求的:
》》》》》 再次调用GetTickCount取得当前系统已运行时间,根据两次的差恢复系统时间。
--------
写注册表?? 关注!
 
修改注冊表達到以上功能完全沒問題!我以前就做過這方面的程式!非常成功!
(你是不想讓你下面的用戶老修改你的系統時間吧!呵!)
你可以先把任務欄上的時間用Windows的功能設成不顯示在任務欄上,當然你如果對注冊表
相當熟悉的話那你就可以只鎖定系統的時間了,在這我暫且不記得,但記得如何把控制面版給
鎖住,相信也可以做到你的要求---不讓修改系統的時間!
操作注冊表
Unit的Uses中加入Registry 此類別在Delphi專門用來操作注冊表
在Private是定義Registry:Tregistry;

打開及操作注冊表
Registry:=Tregistry.create;
Registry.rootkey:=HKEY_LOCAL_MACHINE;
Registry.Openkey('Software/microsoft/Windows/currentVersion/policies/Explorer',true);
Registry.Writeinteger('Nosetfolders',1)
Registry.Free;
OK?應該可以了吧!但必需先確定你有足夠的權限來修改注冊表!
(經重新查看你的問題!這樣你那個問題是解決不了,本不想發了,但也可以給大家看看吧!你那
個問題可能得要參考Novel的運做功能了,因為它的時間就是用的服務器的時間!Sorry)
 
webcom,你那個問題還不行嗎?你如果是要用戶在運行你的程式時不讓修改時間,以上不行嗎?
我試過完全ok啊!
 
用钩子?
什么钩子?
 
改注册表不行,2000/ME读不行!
 
这个问题很难的.关注
 
var
FLastTick: DWORD;
FDateTime. TTimeStamp;

procedure renewSystemTime;
var
SysDateTime: TSYSTEMTIME;
Interval, i: DWORD;
yyyy, mm, dd, hh, nn, ss, ms: WORD;
begin
i := getTickCount - FLastTick;
if i < FDelay then Exit;

// 1、计算时差
Interval := getTickCount - FFirstTick;

// 2、调整时间
FDateTime.SetFromTTimeStamp(DateTimeToTimeStamp(FStartTime));
FDateTime.AddMilliseconds(Interval);

// 3、调整国际时差
DecodeDateTime(FDateTime.AsTDateTime, yyyy, mm, dd, hh, nn, ss, ms);
yyyy := 1500 + yyyy;
hh := (hh + 16) mod 24;

SysDateTime.wYear := yyyy;
SysDateTime.wMonth := mm;
SysDateTime.wDay := dd;
SysDateTime.wHour := hh;
SysDateTime.wMinute := nn;
SysDateTime.wSecond := ss;
SysDateTime.wMilliseconds := ms;

// 4、设置系统时间
FLastTick := getTickCount;
if setSystemTime(SysDateTime) then
//showmessage(DateTimeToStr(FDateTime.AsTDateTime) + ''#10#13'' + DateTimeToStr(now))
else
//showmessage('Error!');
 
需要win9x下的HOOK钩子for delphi,我有!
 
是截获修改系统时间的钩子吗?

是!就发过来!(textmail@mail.china.com)
 

Similar threads

S
回复
0
查看
3K
SUNSTONE的Delphi笔记
S
S
回复
0
查看
2K
SUNSTONE的Delphi笔记
S
后退
顶部