用VB“破解”有時間限制的程序
張 勝
你是否經常遇到有時間限制的程序?我等懶人尤其對此特別反感,可惜囊中羞澀,只好反覆修改其系統日期而使自己多用幾次此軟件——實在是辛苦!於是使用“Anyday32”,可惜也太麻煩了;再後使用“時光倒流”,也不好用,而且——居然還有Bugs!......看樣子只好自己動手做“VB軟件DIY”了。 |
一、問題所在 |
有時間限制的程序大都是依靠在啓動過程中檢測系統日期,再與其記錄的第一次使用日期(放於註冊表或特殊文件中)進行對比檢測是否試用期已到,若試用期已到,可能會在註冊表中作一定的標記,使下次程序不可用。 |
二、解決問題 |
我們一般可以通過修改系統時間來使用此類程序,當然在其作過過期標誌後可能此“大法”就無效了;也有一些程序的檢測細化到了小時,那我們只能將時間也一塊改了。 |
三、DIY中的思路及注意事項 |
我們可以在自己的程序中先修改系統日期,再啓動相應的有時間限制的程序,過一段時間後再將系統日期改回來。 |
注意:在等待外部程序檢測系統日期的等待過程中,系統日期已經改變,那麼我們改回的系統日期將是錯誤的!因此我們要進行一定的檢測,以防止此類錯誤的發生。 |
四、開始軟件DIY |
這裏我們爲方便控制,使用Access數據庫進行軟件編制。 |
數據庫中表的設計: |
|
窗體及控件設計: |
|
CommonDialog和DBGrid控件需要另外加載,其中還需在DBGrid的屬性頁中進行一定的數據庫掛接和設置,要在其屬性頁中“佈局”中的第二列的“按鈕”選中。 |
以下是本小軟件的源代碼: |
Option Explicit |
'啓動外部應用程序的API函數定義 |
Private Declare Function ShellExecute Lib "shell32.dll" Alias "ShellExecuteA" _ |
(ByVal hwnd As Long, ByVal lpOperation As String, ByVal lpFile As String, _ |
ByVal lpParameters As String, ByVal lpDirectory As String, ByVal nShowCmd As Long) As Long |
Dim OldDate As Date '保存系統日期 |
Private Sub Command1_Click() |
If Not Data1.Recordset.EOF Then '若數據庫正在添加記錄則不動作 |
Date = Data1.Recordset(2) '改系統時間 |
Call ShellExecute(0, vbNullString, Data1.Recordset(1), vbNullString, vbNullString, vbOK) '啓動外部程序 |
Me.Enabled = False '屏蔽其他操作 |
Timer1.Enabled = True '啓動延時記時器 |
End If |
End Sub |
Private Sub Command2_Click() |
End '關閉本系統 |
End Sub |
Private Sub DBGrid1_BeforeUpdate(Cancel As Integer) |
If MsgBox("記錄改變嗎?", vbYesNo + vbQuestion) <> vbYes Then Cancel = True '是否更新數據庫控制 |
End Sub |
Private Sub DBGrid1_ButtonClick(ByVal ColIndex As Integer) |
On Error GoTo errdeal '打開錯誤監測 |
CommonDialog1.CancelError = True '系統對話框錯誤控制 |
CommonDialog1.ShowOpen '打開系統對話框 |
If CommonDialog1.filename <> "" Then DBGrid1.Text = CommonDialog1.filename '寫入要啓動的程序信息 |
errdeal: |
End Sub |
Private Sub Form_Load() |
OldDate = Date '保存系統時間 |
Call Parameter '獲取系統啓動時的參數 |
End Sub |
Private Sub Timer1_Timer()’五秒鐘後恢復 |
If Format(Time, "HH:MM:SS") < "00:00:05" Then OldDate = OldDate + 1 '防止在接近零時時的日期恢復錯誤 |
Date = OldDate '恢復系統時間 |
Me.Enabled = True '恢復正常操作 |
Timer1.Enabled = False '屏蔽延時記時器 |
If Check1.Value = 1 Then End '是否關閉本系統 |
End Sub |
Private Sub Parameter() '系統參數處理 |
If Command <> "" Then |
'查找相應的啓動程序 |
Data1.RecordSource = "Select * From [StartProgram] Where [程序名稱]='" & Trim(Command) & "'" |
Data1.Refresh |
If Not (Data1.Recordset.EOF And Data1.Recordset.BOF) Then |
Me.Hide '隱藏本系統 |
Check1.Value = 1 '設置關閉標誌 |
Command1_Click '激活本系統的執行事件 |
Else |
'未找到處理 |
MsgBox "沒有此啓動程序!", 16, Me.Caption '錯誤提示 |
End '關閉 |
End If |
End If |
End Sub |
五、小 結 |
本小軟件可啓動多個有時間限制的程序,也可以通過命令參數(格式是:本程序名 要啓動的程序名稱)一次啓動一個程序,可用於作相應的快捷方式(和Anyday32類似),讓你放心去使用。 |
程序編完了,但還需你的完善和潤色,遇到問題自己解決——我是軟件DIY人! |