2015-06-27 32 views
-1

我写了一个绕过特定时间的游戏速度快车。游戏让你等待5分钟。当它首先查看系统时间以及计时器(5分钟)完成时,它再次比较系统时间并检查延迟是否是5分钟。将编程和准确的时间添加到系统时间

伪游戏:

var t = GetSystemTime(); 
WaitMinutes(5); 
if (GetSystemTime() - t != 5000) 
{ 
    Error; 
} 

我明白了手动旁路这样的:

等到比赛等待1分钟,以便有剩下4分钟的等待时间。确切地说,系统时钟改为+ 4分钟。

然后用CE或我的工具加快游戏的游戏速度。

但是,我想以编程方式做到这一点,它似乎不够准确,我怎么做。

GetLocalTime(systimecurr); 
    wmin := systimecurr.wMinute + iWaitingTime; 
    whour := systimecurr.wHour; 
    wday := systimecurr.wDay; 
    wsecs := systimecurr.wSecond + iWaitingTimeSeconds; 



    if wsecs >= 60 then 
    begin 
    wsecs := wsecs mod 60; 
    wmin := wmin + 1; 
    end; 

    if wmin >= 60 then 
    begin 
    wmin := wmin mod 60; 
    whour := whour + 1; 
    if whour >= 24 then 
    begin 
     wday := wday + 1; 
    end; 
    end; 

    SetDateTime(systimecurr.wYear, systimecurr.wMonth, wday, wHour, 
       wmin, wsecs, systimecurr.wMilliseconds); 

我知道这不能准确,但我实际上不知道如何完美地做到这一点。

再次:我需要添加时间(例如5分钟)到系统时钟精确到它检索到的偏移量!

感谢您的帮助!

+0

我不知道你在说哪个游戏在这里。实际上使用系统时钟来实现事件的游戏并不多。我想这可能就是那些“永久游戏”之一,因为他们有时倾向于称他们为游戏能够快速模拟自上次游戏运行以来所经过的时间的事件。无论如何,我个人会因为您迅速改变系统时间而感到不便。为什么?这样做可以导致Windows出现一些奇怪的行为。例如,你可以防止窗口真正知道最后访问哪个文件。 – SilverWarior

+0

此外,一些反病毒软件程序可能会将您的程序标记为潜在危险,并因此将其隔离,因为已知某些病毒会以编程方式更改系统时钟,以尝试并消除其传播痕迹。 – SilverWarior

+2

因此,为了避免可能出现的问题,您可能至少要考虑在虚拟环境中运行您的游戏,以防止您的作弊方式影响您的主机系统。 – SilverWarior

回答

1

好吧我得到它的工作。实际上这个小代码之间有一段很长的时间:D

QueryPerformanceCounter解决了它!

这里正确的代码:

GetLocalTime(systimecurr); 
    **QueryPerformanceFrequency(freq); 
    QueryPerformanceCounter(startTime);** 
    wmin := systimecurr.wMinute + iWaitingTime; 
    whour := systimecurr.wHour; 
    wday := systimecurr.wDay; 
    wsecs := systimecurr.wSecond + iWaitingTimeSeconds; 
    wmilli := systimecurr.wMilliseconds; 

    if wsecs >= 60 then 
    begin 
    wsecs := wsecs mod 60; 
    wmin := wmin + 1; 
    end; 

    if wmin >= 60 then 
    begin 
    wmin := wmin mod 60; 
    whour := whour + 1; 
    if whour >= 24 then 
    begin 
     wday := wday + 1; 
    end; 
    end; 

    **QueryPerformanceCounter(endTime);** 

    **wmilli := wmilli + ((endTime - startTime) * 1000 div freq);** 

    SetDateTime(systimecurr.wYear, systimecurr.wMonth, wday, whour, 
       wMin, wsecs, wMilli); 

    showmessage(inttostr(wmilli)); 
+0

请注意,您需要管理员权限才能更改系统时钟。 ['SYSTEMTIME'文档](https://msdn.microsoft.com/en-us/library/windows/desktop/ms724950.aspx)告诉你如何对日期/时间值执行算术,你不需要求助解码各个组件。使用'FILETIME'将'SYSTEMTIME'转换为'ULARGE_INTEGER',根据需要递增/递减(以100纳秒为间隔)并转换回'SYSTEMTIME'。 –