1. 程式人生 > >第五章——演示版保護技術-時間限制,選單功能限制

第五章——演示版保護技術-時間限制,選單功能限制

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