天天看点

第五章——演示版保护技术-时间限制,菜单功能限制

时间限制程序一种为每次运行时长10.20分钟后停止,必须重新启动。计时器有如下选择:

1.setTime()函数

此函数可以在程序调用的时候,指定一个时间,同时获取一个超时后的回调函数。如果超过这个时间,系统则会给计时器窗口发送WM_TIMER,或者调用程序提供的回调函数

函数原型:

UINT_PTRSetTimer(

  HWND hWnd,                    // 窗口句柄

  UINT_PTR nIDEvent,           // 定时器ID,多个定时器时,可以通过该ID判断是哪//个定时器

  UINT uElapse,                     // 时间间隔,单位为毫秒

  TIMERPROC lpTimerFunc   // 回调函数

);

回调函数原型:

void CALLBACK TimerProc(

HWND     hwnd,

UINT        uMsg,

UINT        idEvent,

DWORD   dwTime

);

SetTimer()函数是以windows消息分发方式工作,如果程序不需要计时器可以调用KillTimer()来销毁计时器

2.高精度多媒体计时器

timeSetEvent()函数

MMRESULT timeSetEvent( 

                                 UINT                         uDelay,

                                 UINT                         uResolution,

                                 LPTIMECALLBACK    lpTimeProc,

                                 WORD                      dwUser,

                                 UINT                         fuEvent )

         uDelay:以毫秒指定事件的周期。

         Uresolution:以毫秒指定延时的精度,数值越小定时器事件分辨率越高。缺省值为1ms。

         LpTimeProc:指向一个回调函数。

         DwUser:存放用户提供的回调数据。

         FuEvent:指定定时器事件类型:

         TIME_ONESHOT:uDelay毫秒后只产生一次事件

         TIME_PERIODIC :每隔uDelay毫秒周期性地产生事件。

该函数的参数说明如下:参数uDelay表示延迟时间;参数uResolution表示时间精度,在Windows中缺省值为1ms;lpTimeProc表示回调函数,为用户自定义函数,定时调用; 参数dwUser表示用户提供的回调数据;参数fuEvent为定时器的事件类型,TIME_ONESHOT表示执行一次;TIME_PERIODIC:周期性执行。具体应用时,可以通过调用timeSetEvent()函数,将需要周期性执行的任务定义在lpTimeProc回调函数中(如:定时采样、控制等),从而完成所需处理的事件。需要注意的是:任务处理的时间不能大于周期间隔时间。另外,在定时器使用完毕后,应及时调用timeKillEvent()将之释放。

3.GetTickCount()函数

    该函数返回的事系统成功启动以来所经过的时间,所以调用两次,用相减去计算程序运行的时间。也可以利用C语言中的time()函数,类似的函数也有timeGetTime()

时间限制思路:

    软件通常会采用GetSystemTime,GetLocalTime,GetFileTime,这三个API来获取系统时间,之后和上一次程序关闭的时候进行对比,我们可以在这几个函数下断。还有一种方法,软件通过读取系统文件(windows的 user.bat或system.dat)来判断最后的修改时间,利用FileTimeToSystemTime()来转换为系统日期格式,从而获取当前系统时间,(但是这种方式必须防备RegMon,FileMon之类的软件)

菜单功能限制

    菜单限制就是非付费版的软件,功能会不齐全,付费后功能全部解锁,相关的函数有:

1.EnableMenultem()函数

BOOL EnableMenultem(

                HMENU       hMenu,                    //菜单句柄

                UINT            uIDEnableItem,        //禁止或允许一个菜单条目的标识符

                UINT            uEnable);                  //控制标志  

控制标志:MF_ENABLED(允许,0h) 、MF_GRAYED(灰化 ,1h)、MF_DISABLED(禁止,2h) 等

返回值:返回以前的状态。如果菜单项不在,返回FFFFFFFFh

EnableWindow()函数

允许或禁止制定窗口

BOOL EnableWindow(

        HWND    hWnd,                 //窗口句柄

        BOOL       bEnable);            //TRUE为允许,FALSE为禁止

返回0为失败,非零为失败