四、如何慢慢提升自己的API功力?
何為API功力?其實沒必要搞那麼清楚,首先需要搞明白的就是,你應該知道在什麼環境下使用什麼API,實現哪些功能應該使用哪些API!這才是我們需要的。
1,試著自己從小程式開始寫起。
寫小程式?對!在你寫小程式時應該揀你最感興趣的程式寫,否則有可能你寫到一半以後會覺得自己這個程式寫得毫無價值,簡直是在浪費時間,最後到頭來還是功虧一簣。這塈畬酗偵繴篳D材呢?我在這堣]想了很久,最後還是決定選擇一個登出Windows程式來做題材。
註銷Windows也就是退出Windows,根據表面意思在API流覽器中輸入Exit(退出)Windows,看看有沒有這個API?這奡ˋ穭@下,你在查找這個API的時候還會看到Exi●綜合木馬網站●ont=新細明體]這個API,其實這兩個API實現的功能一樣,前者是用在16位元作業系統上,只不過在Win32位元作業系統上一般都使用Exi●綜合木馬網站●ont=新細明體]。所以這奡N使用後者。API見以下:
Private Declare Function ExitWindowsEx Lib "user32" Alias "ExitWindowsEx" (ByVal uFlags As Long, ByVal dwReserved As Long) As Long
看看堶悸漕潃荌捊ヾAByVal uFlags As Long?這塈畯抳搨n傳入一個整形數位,可是應該傳入什麼數字呢?這婸﹞U,API中的參數可以傳入不同的值,不同的值從而導致產生不同的結果。分析API中參數應該傳遞哪些值其實是有技巧的,以後大家只要是看到參數字元中包函Flags字元的話那就說明該參數可以被傳入一個或多個標誌,並且大部分都是傳入API常數(什麼是API常數就不用我說了吧)。說白話點,就是我們可以傳入多個API常量,並且可以在API流覽器中找到,當然,不一定所有的API常數都可以在API流覽器中找到,不過大部分都可以。
在API流覽器查API常量時我前面就教過大家技巧,現在該是我們實踐的時候了,分析如下:
Exit
:頭一個大寫字元 E
Windows:頭一個大寫字元 W
Ex
:頭一個大寫字元 E
組合 :EWE_
好了,現在在API流覽器的中常數中找找,咦?發現好像沒有以EWE開頭的常數??只發現以EWX開頭的?現在先別著急,咱們回過頭來再分析下,咱們是失敗在最後一步Ex上,這塈琱ㄠo不否決我前面教過大家的技巧,但是又不能完全否決,出現這種情況時就需要大家靈活運用API常數的分析法,可以看到EWX最後一個X是以Ex的X作結尾的,以這種方法做API常數開頭的不止這一個,所以這塈痧S意留了一個陷阱,希望給大家帶來一些經驗將來能夠靈活運用。現在我把關機uFlags所能用到的相關常數發上來,如下:
Private Const EWX_FORCE = 4
Private Const EWX_LOGOFF = 0
Private Const EWX_REBOOT = 2
Private Const EWX_SHUTDOWN = 1
EWX_FORCE 前面的 EWX_ 我就不說了,關鍵是看 _ 符號後面的,Force 單詞翻譯:強制,強迫。人工在翻譯一下,意思是說:強制執行ExitWindowsEx API關機函數。不知道這樣解釋你能不能明白。那到底這個常數有什麼用呢?這塈畯怚回憶一下以前關機的時候,當Windows無法關閉某些視窗的時候就停止繼續關機了,最後還得把無法關閉的視窗手動關閉方可,現在,如果我們使用這個常數進行關機,那Windows不管你視窗能不能關閉,直接強制關閉。希望你懂了。
EWX_LOGOFF 這個嘛,貌似組合單詞,不可直接翻譯,那樣就不是那個意思了。Logout Off,是這樣寫嗎?註銷的意思。
EWX_REBOOT 不浪費時間了,直接說明意思:重新啟動。
EWX_SHU●綜合木馬網站●ont=新細明體]關機。
至於第二個ByVal dwReserved As Long,為保留整形,一般為0即可。至於為什麼為0,大家可以到網上下載一些專門講解API函數的電子書看看,堶惘酗j部分API函數的詳細講解。或者下載VS.MSDN看看,在MSDN中說Windows 2000/95/98/Me中此參數忽略,XP中是指定關機消息說明。
最後看看這個API為Function聲明,說明該函數有返回值,返回值為Long,MSDN中說:如果執行成功,則返回非零,否則為零。
現在上面已經把這個關機API和相關參數常量都給你分析透了,你可別告訴我你還不知道怎麼寫?好了,這塈畯怜竣@個定時登出程式,呵呵,雖然很簡單,不過很多時候用得上哦!在Form視窗上添加Timer控制項,Interval 設置為1000,Enabled 設置為 True。好了,代碼如下:
Private Declare Function ExitWindowsEx Lib "user32" (ByVal uFlags As Long, ByVal dwReserved As Long) As Long
Private Const EWX_LOGOFF = 0
Private Sub Timer1_Timer()
Static i As Integer
i = i + 1
Me.Caption = i '這一步純粹是想看看當前已經執行到幾秒了?可不要
If i = 10 Then '秒數判斷,可以根據自己的需要進行運算
ExitWindowsEx EWX_LOGOFF, 0
End If
End Sub
其實我都有點不想分析了,不過為了照顧大眾,不得不說下,Static i As Integer 靜態變數(問:啥叫靜態變數?答:我暈!),i = i + 1是每執行Timer一次i就加1,Timer的interval設置為1000,1000為一秒,2000為二秒。。。。後面一個If i = 10 Then是判斷當i=10以後,也就是10秒,就執行註銷,這個時候你可別忘了保存好你的其他沒有保存的檔哦,如果沒保存資料丟失的話偶不承擔任何法律責任的。其實這塈畯怚i以自己做一個,如可以寫成這樣:ExitWindowsEx EWX_LOGOFF Or EWX_FORCE, 0,其中用了Or運算,整體的意思是強制Windows註銷。這樣理解就夠了,只要能讓你明白。
現在我又要說一下了,不說不行的!就是在API中使用 Or 運算,關於Or運算符VB書中都有詳細解釋的,別告訴我你沒看?沒看馬上去看!上面EWX_LOGOFF Or EWX_FORCE 的使用是把 註銷 和 強制 進行Or位運算,對兩個數值執行按位析取,這堹A及到二進位運算,說多了你可能不明白,我就說簡單點的吧,以後如果你想組合兩個API常數的功能,一般都是用 Or 進行運行的。如上面寫的。
好了,保存其他文件,然後F5運行之,看著Form標題的數字慢慢添加,當為10時,Windows開始註銷。。。
小提示:在使用EWX_SHU●綜合木馬網站●ont=新細明體]的時候你可能會感覺沒有作用,主要是NT系統的安全性提高,需要用其他API進行提升自己的許可權才可以。關於如何提升應用程式許可權請百度一下。
2,先從一些最簡單的API開始
無疑自己試著寫程式是最好的提升方法,學完一些知識以後自己試著寫寫,這樣能讓你理解的更快更好,好了不說廢話了,接著往下看。
最簡單的API,呵呵,哪些最簡單呢?這個我也說不好,這樣吧,咱們就從Get(獲取)開始,那Get什麼呢?Window(視窗),還是從視窗下手吧,這樣更接近我們日常的編程,誰叫這是一個Windows作業系統呢?先列幾個常用的API:
Ge●綜合木馬網站●ont=新細明體]、Ge●綜合木馬網站●ont=新細明體]、GetWindowLong、GetWindowRect、Ge●綜合木馬網站●ont=新細明體]、GetWindowsDirectory、GetWindowText、GetWindowThreadProcessId
還有很多,我就先列舉幾個簡單點的,咱們就從這幾個中間隨便抽幾個來講講吧。
先從GetWindowText下手,大家就表面的意思進行理解下,Get(獲取)Window(視窗)Text(文本),Very Good!這個API以前不錯的,可以獲取密碼框中的密碼,呵呵,說到這堙A我估計有些人開始興奮起來了!那好,Follow Me!
新建一個Form視窗,然後添加一個CommandButton,Caption設置為:顯示密碼。接著添加兩個TextBox,Text1屬性設置:PasswordChar=*;Text=123456789,Text2的屬性基本上沒有什麼需要設置的,只需要把Text屬性為空就可以了,它主要是用來幫助咱們顯示出密碼的。好了,在Form1代碼框中填入以下代碼:
Private Declare Function GetWindowText Lib "user32" Alias "GetWindowTextA" (ByVal hwnd As Long, ByVal lpString As String, ByVal cch As Long) As Long
Private Sub Command1_Click()
Dim sBuffer As String
sBuffer = Space(255)
GetWindowText Text1.hwnd, sBuffer, 255
Text2.Text = sBuffer
End Sub
OK,F5運行,點擊Command1,怎麼樣?Text1中的密碼字元顯示在Text2中了吧?你可以再更改下Text1中的密碼,然後再點擊Command1試試。也許你覺得會多此一舉,為何不Text2.Text=Text1.Text這樣?如果真的這樣的話看似簡單,那你就學不到API了。
又到了開始分析的時候了,打起精神來,先看第一句:Dim sBuffer As String,不用說,聲明一個字串變數唄!接著看第二句:sBuffer = Space(255) 那這一句呢?有些人可能不知道了,沒事,我會仔細講的。Space是VB內置的字串處理函數,VB中的幫助檔中有說明:
開始{
本示例使用 Space 函數來生成一個字串,字串的內容為空格,長度為指定的長度。
Dim MyString
' 返回 10 個空格的字串。
MyString = Space(10)
' 將 10 個空格插入兩個字串中間。
MyString = "Hello" & Space(10) & "World"
}結束
很顯然,我這一句是要分配255個空格字串記憶體,為啥要用分配?這都是為後面所要用到打定的基礎。接著往下:
GetWindowText Text1.hwnd, sBuffer, 255 這一步是關鍵,通過它來獲取咱們想要的視窗文本,看第一個參數,我前面講過hwnd一般都是需要傳入控制碼的,這時咱們傳入了Text1.hwnd(Text1控制項的控制碼),第二個參數,lpSting為字串變數,所以這堳平抾リJsBuffer字串變數。最後一個cch為Long整形,所以理應傳入數字,這塈畯抾リJ了255。現在又有人想問了,為什麼需要這麼傳入值?貌似和以前的傳入不一樣?確實!一剛開始你可能搞不懂,這時候我先講講大概的意思,我們用GetWindowText來獲取視窗中的文本,當獲取成功以後,理所當然會返回視窗中的字串,但是當我們用這個API進行獲取時,必須需要一個緩衝來保存我們所獲取的字串,你如果不信去試試把sBuffer = Space(255)去掉,後面的255其實就是告訴這個API我們緩衝字串的大小,這埵A告訴大家一個技巧,以後只要是看見包函有cch字元時,大部分都是輸入相關類型的大小。
再附加一點,就塈睇★L,hwnd是用來傳控制碼的,你也可以傳入其他視窗控制碼,只要其他視窗有文本,都是可以通過這個API獲取的。還有Text2.Text = sBuffer其實是可以先把sBuffer處理一下再傳給Text2.Text的,關於字串處理這堣講。
好了,分析結束,來個小提示:在Windows作業系統中,任何有控制碼的東東都可被看作為一個視窗。另外你可能會去試試QQ的密碼框,^_^ 這塈畯n告訴你一下,無法成功,為什麼無法成功呢?這是一個技術問題目前不提!
接著再來試試GetWindowsDirectory,大家看表面意思吧!Get(獲取)Windows(就是Windows目錄)Directory(目錄),也就是獲取咱們那個系統目錄,如:C:\Windows。可能我的Windows目錄中在C盤,而其他人的可能在D盤、E盤也說不定,所以有的時候軟體需要這個API進行獲取作業系統具體的Windows目錄。
好了,還是新建一個標準EXE,添加一個CommandButton,屬性Caption=顯示Windows目錄,OK,寫入以下代碼:
Private Declare Function GetWindowsDirectory Lib "kernel32" Alias "GetWindowsDirectoryA" (ByVal lpBuffer As String, ByVal nSize As Long) As Long
Private Sub Command1_Click()
Dim sBuffer As String
sBuffer = Space(255)
GetWindowsDirectory sBuffer, 255
MsgBox "Windows目錄在: " & sBuffer
End Sub
分析!第一個Dim sBuffer As String字串變數,sBuffer = Space(255)緩衝字串,GetWindowsDirectory sBuffer, 255這個和上面所講的一樣,最後一個參數nSize為Long整形,所以傳入數值,那傳入什麼數值呢?Size???當然是緩衝字串大小了,以後遇到這個nSize一般也是傳入相關類型的大小的。MsgBox "Windows目錄在: " & sBuffer,是用MsgBox訊息方塊顯示出Windows目錄的位置。
OK,恭喜你,你又會使用了一個API,還要繼續嗎?
|