時間限制程式一種為每次運作時長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為失敗,非零為失敗