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

时间限制程序一种为每次运行时长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为失败,非零为失败
 
 
 

猜你喜欢

转载自www.cnblogs.com/Tempt/p/10134260.html