天天看點

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

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