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