欧美性猛交XXXX免费看蜜桃,成人网18免费韩国,亚洲国产成人精品区综合,欧美日韩一区二区三区高清不卡,亚洲综合一区二区精品久久

打開(kāi)APP
userphoto
未登錄

開(kāi)通VIP,暢享免費電子書(shū)等14項超值服

開(kāi)通VIP
在VB中使用API函數詳解
API(Advanced Programmers Interface,高級程序員接口)(注:API實(shí)際是指Application Programming Interface,應用程序編程接口;此處疑為原文錯誤,不過(guò)在VB中也可以這么說(shuō)吧!)是一套用來(lái)控制Windows的各個(gè)部件(從桌面的外觀(guān)到位一個(gè)新進(jìn)程分配的內存)的外觀(guān)和行為的一套預先定義的Windows函數.用戶(hù)的每個(gè)動(dòng)作都會(huì )引發(fā)一個(gè)或幾個(gè)函數的運行以Windows告訴發(fā)生了什么.
一、什么是API?   API(Application Programming Interface,應用程序編程接口)是一套用來(lái)控制Windows的各個(gè)部件(從桌面的外觀(guān)到位一個(gè)新進(jìn)程分配的內存)的外觀(guān)和行為的一套預先定義的Windows函數.在某種程度上很象Windows的天然代碼.其他的語(yǔ)言只是提供一種能自動(dòng)而且更容易的訪(fǎng)問(wèn)API的方法.
二、Windows的一些特別之處   Windows通過(guò)句柄(Handle)識別每個(gè)窗體,控件,菜單,菜單項或其他任何你能想得到的東西.當你的程序運行時(shí),它所包含的每個(gè)部件都有一個(gè)唯一確定的句柄用來(lái)同其他的部件相區別.例如,某個(gè)按鈕得句柄就與其他部件不同,當你想要通過(guò)API來(lái)執行有關(guān)該按鈕的某種操作時(shí)就必須使用這個(gè)句柄.從哪兒得到它呢?VB 為每個(gè)擁有Windows句柄的控件都提供了Hwnd屬性來(lái)表示其句柄.
Windows的一些特別之處   這個(gè)主題是要告訴你Windows 的一些與在VB中的不同的細節   Windows通過(guò)句柄(Handle)識別每個(gè)窗體,控件,菜單,菜單項或其他任何你能想得到的東西.當你的程序運行時(shí),它所包含的每個(gè)部件都有一個(gè)唯一確定的句柄用來(lái)同其他的部件相區別.例如,某個(gè)按鈕得句柄就與其他部件不同,當你想要通過(guò)API來(lái)執行有關(guān)該按鈕的某種操作時(shí)就必須使用這個(gè)句柄.從哪兒得到它呢?VB 為每個(gè)擁有Windows句柄的控件都提供了Hwnd屬性來(lái)表示其句柄.  
 Windows 使用像素(Pixel)而不是緹(Twip).因此,把涉及API函數調用的控件的ScaleMode屬性設為3--(Pixel)是個(gè)不錯的主意,這樣你可以通過(guò)ScaleXXX屬性得到它們的公制單位值.盡管這樣,你可能有時(shí)仍需要進(jìn)行從Twip到Pixel的轉換(反之亦然),你可以通過(guò)Screen對象的TwipsPerPixelX和TwipsPerPixelY來(lái)實(shí)現.舉例如下:
PixelXValue=TwipXValue\Screen.Twips
PerPixelX PixelYValue=TwipYValue\Screen.Twips
PerPixelY TwipXValue=PixelXValue*Screen.Twips
PerPixelX TwipYValue=PixelYValue*Screen.Twips
PerPixelY   
我并沒(méi)有在實(shí)際中見(jiàn)到過(guò)TwipsPerPixelX 和 TwipsPerPixelY 的值有什么不同,但你最好是把它們區別開(kāi)來(lái)而不是混用,這至少是一種好的程序設計風(fēng)格.另外需要注意的是,這里用的是" \ "(整除) 而不是 " / " ,這是因為像素值必須是整數.   另外需要提到的是,Windows函數中用到了不同的坐標系統,因此需要注意.
 
Windows的一些特別之處   最后要注意的是,一旦你使用了API 函數,VB就可能不再可靠了---API調用中一個(gè)簡(jiǎn)單的語(yǔ)法錯誤就會(huì )導致VB 崩潰!(請經(jīng)常保存您的工程).VB 并不能識別API調用中的錯誤,因此一旦你的程序出現異常,要先檢查API調用---是否缺少 ByVal,或者是錯誤的類(lèi)型,參數等等. 從哪里得到有關(guān)函數的說(shuō)明?   這個(gè)主題不會(huì )告訴你如何通過(guò)API函數改變按鈕文字或如何快速查找一個(gè)文件.這不是一個(gè)API函數文檔.   為了得到有關(guān)函數的說(shuō)明,你需要SDK幫助或微軟的SDK文檔(至少有40M---我怎么可能放在這里?).這些SDK幫助通常都包含在Borland Dephli 3.0 開(kāi)發(fā)包或者M(jìn)S Visual C++中.到網(wǎng)上去或找您的朋友要一個(gè),版本越新越好   注意Win3.x 的SDK 幫助對你并沒(méi)有用,因為很多函數已經(jīng)過(guò)于陳舊甚至廢棄不用,盡管他們中的大多數由于與 Windows95兼容而依然存在.
 
API參數類(lèi)型   如果你已經(jīng)有了一個(gè)SDK幫助,你肯定主意到了函數的返回之或參數有很多奇怪的類(lèi)型如VOID,LPCSTR, 和DWORD.如果你對C語(yǔ)言比較熟悉的話(huà),那你肯定明白它們的意思.對于其他不熟悉C語(yǔ)言的人,這里有一張摘自 VB Books Online(標題是:C語(yǔ)言聲明到Visual Basic的轉換) Books Online(標題是:C語(yǔ)言聲明到Visual Basic的轉換) <> bordercolordark="#FFFFFF" cellpadding="0"> <>

bordercolordark="#FFFFFF" cellpadding="0">

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

C 語(yǔ)言數據類(lèi)型 在VB中的聲明 Call with
ATOM ByVal variable As Integer An expression that evaluates to an Integer
BOOL ByVal variable As Long An expression that evaluates to a Long
BYTE ByVal variable As Byte   

 

          

An expression that evaluates to a Byte
CHAR ByVal variable As Byte   

 

          

An expression that evaluates to a Byte
COLORREF ByVal variable As Long                An

 

expression that evaluates to a Long

DWORD ByVal variable As Long   

 

          

An expression that evaluates to a Long
HWND, HDC,HMENU,etc.(Windows handles) ByVal variable As Long   

 

          

An expression that evaluates to a Long
INT, UINT ByVal variable As Long An expression that evaluates to a Long
LONG ByVal variable As Long An expression that evaluates to a Long
LPARAM   

 

               

 

ByVal variable As Long   

 

           

An expression that evaluates to a Long
LPDWORD variable As Long An expression that evaluates to a Long
LPINT, LPUINT variable As Long An expression that evaluates to a Long
LPRECT variable As type Any variable of that user-defined type
LPSTR, LPCSTR ByVal variable As String An expression that evaluates to a String
LPVOID variable As Any Any variable (use ByVal when passing a string)
LPWORD variable As Integer An expression that evaluates to an Integer
LRESULT ByVal variable As Long An expression that evaluates to a Long
NULL As Any orByVal variable As Long ByVal Nothing or ByVal0& or vbNullString  
SHORT   

 

                

 

ByVal variable As Integer An expression that evaluates to an Integer
VOID Sub procedure Not applicable
WORD ByVal variable As Integer An expression that evaluates to an Integer
WPARAM ByVal variable As Long An expression that evaluates to a Long
 
API參數類(lèi)型 注釋:   
       你應該注意到了BOOL類(lèi)型(Boolean)求出的值為L(cháng)ong而不是Boolean.因此0表示"假"(False),其他任何值表示"真"(True).   HWND,HDC,HMENU,etc.---etc.指其他所有與于前面所述相似的類(lèi)型.它們都以"H"開(kāi)頭來(lái)表示不同對象的句柄.舉例來(lái)說(shuō),HBITMAP表示一副位圖的句柄,HBRUSH標是一個(gè)刷子的句柄等等.它們均為L(cháng)ong而且要按值傳遞(ByVal).   
      同樣要注意LPVOID被聲明為Any型變量,本文將會(huì )有獨立的一個(gè)主題用來(lái)論述Any類(lèi)型.   
     有些類(lèi)型以"LP"開(kāi)頭.LP 是Long Pointer的縮寫(xiě).因此LPWORD實(shí)際表示數據所存的內存地址.不過(guò),你并沒(méi)有必要調用某個(gè)函數來(lái)獲取這個(gè)地址.當你按引用(ByRef)傳遞參數時(shí),你實(shí)際上傳遞的就是它的地址.在這里你只需記住:如果某個(gè)參數的類(lèi)型以"LP"開(kāi)頭,應該按引用(ByRef)傳遞.順便說(shuō)一句,LPARAM 與 Lparam 很相似但不是Lparam,Lparam不是一個(gè)指針,在這里你必須傳遞它的真實(shí)值,因此要按值(ByVal)傳遞.   
     NULL也是一種奇怪的類(lèi)型.你可以從 VB 中了解到有關(guān)它的描述,這里我不去討論它.按你需要的形式傳遞它吧,在大多數情況下,可以用 ByVal 0& 或 vbNullString.   
     最后,VOID是用來(lái)指那些沒(méi)有返回值的函數的.API中沒(méi)有SUBs,這就是它們的標志.只要記住:如果一個(gè)函數被聲明為VOID ,你必須在 VB 中把它聲明為 SUB
 
Any   
     有些消息的參數聲明為Any.這表示該參數是一種可變的類(lèi)型(你可以以整型,字符串,用戶(hù)自定義或其他的類(lèi)型來(lái)傳遞). 這有一個(gè)這樣的例子:
Public Declare Function SendMessage Lib "User32" Alias "SendMessageA"( ByVal Hwnd as Long, ByVal wMsg as Long, ByVal wParam as Long, lParam as Any) as Long lParam 聲明為Any并按引用(ByRef)傳遞.   
    這里是在這個(gè)函數中如果lParam是不同類(lèi)型的值時(shí)應遵循的規則: 如果該值是 傳遞形式 numeric ByVal(as Long,or as Any) Null ByVal(as Long,or as Any) String ByRef(as String,or as Any) Type ByRef(as Any) array of Type ByRef(as Any)   
     如果你的函數聲明同上面的一個(gè)而且你想傳遞一個(gè)Long型數,你應該這樣寫(xiě):
     Call SendMessage(Me.Hwnd,WM_XXXX,0&,ByVal LongValue)   
      注意盡管頭三個(gè)參數也是數值,但它們前邊并沒(méi)有ByVal.這是因為在函數聲明中它們已經(jīng)被聲明為按值傳遞(ByVal).第四個(gè)參數,由于是按引用傳遞(ByRef)(VB并不知道你要傳遞參數的類(lèi)型),因此你必須加上ByVal 你可以使用別名技術(shù)來(lái)傳遞不同類(lèi)型的參數:
Public Declare Function SendMessageLng Lib "User32" Alias "SendMessageA"(ByVal Hwnd as Long, ByVal wMsg as Long, ByVal wParam as Long, ByVal lParam as Long) as Long
或:
 Public Declare Function SendMessageStr Lib "User32" Alias "SendMessageA"(ByVal Hwnd as Long, ByVal wMsg as Long, ByVal wParam as Long, lParam as String) as Long   
 
     注意API參數類(lèi)型本身是不會(huì )改變的.例子中的第四個(gè)參數總是一個(gè)4字節的長(cháng)型數.當你按值(ByVal)傳遞一個(gè)Long或 Null時(shí),該4字節長(cháng)的數值就直接傳遞給函數.如果你傳遞一個(gè)String或其他的什么,你是按引用(ByRef)傳遞,VB傳遞的實(shí)際上是變量的地址,也是4個(gè)字節.
 
參數傳遞   你已經(jīng)知道如何傳遞參數了,只需把他放到調用的函數中即刻.然而,當你使用API函數時(shí),在傳遞參數是有一些你應該注意的 細節. ByVal還是ByRef. 通常情況下,你不用為此擔心,VB的API瀏覽器已經(jīng)為你做好了一切,只需你輸入數值它就會(huì )照所聲明的方式傳遞.總的來(lái)說(shuō),ByVal是把實(shí)際的數值傳遞給函數,而B(niǎo)yRef是把地址傳給函數.唯一的麻煩就是 Any 類(lèi)型. 把字符串傳遞給API函數也并不難.API函數需要的是字符串首字符的地址,然后讀取該地址直到遇到一個(gè)Null字符.聽(tīng)起來(lái)很糟糕,但只是VB處理字符串的實(shí)際方法.你唯一要記住的是一定要按引用傳遞(ByRef)字符串 當你想得到所需的函數返回值信息時(shí),情況有稍微的一點(diǎn)不同. 這里是GetComputerName函數的聲明:
Declare Function GetComputerName Lib "kernel32" Alias "GetComputerNameA"(ByVal lpBuffer As String, nSize As Long) As Long
第一個(gè)參數是一個(gè)指向字符串的遠程指針,第二個(gè)參數是字符串的長(cháng)度.
  如果你只是簡(jiǎn)單的聲明一個(gè)字符串類(lèi)型的變量并把它傳遞給函數,就會(huì )出現錯誤.因此,你首先需要初始化字符串.這里是如何得到計算機名字的例子:
 Dim Buffer As String Buffer = Space(255) Ret& = GetComputerName(Buffer, Len(Buffer)) if Ret& > 0 then CompName$ = Left(Buffer, Ret&)   
         在這里,待傳遞的字符串被初始化為有255個(gè)空格的字符串.我們把它傳遞給函數同時(shí)還有它的長(cháng)度.如果出錯則返回值為0.
 
參數傳遞
    CompName中將保存計算機名. 有些函數也需要傳遞數組,這里是一個(gè)例子:
Declare Function SetSysColors Lib "user32" Alias "SetSysColors" (ByVal nChanges As Long, lpSysColor As Long, lpColorValues As Long) As Long   
     最后兩個(gè)參數是Long型數組.為了傳遞數組,你只需傳遞它的第一個(gè)元素.
下面是示例代碼:
 Const COLOR_ACTIVECAPTION = 2 Const COLOR_INACTIVECAPTION = 3
Const COLOR_CAPTIONTEXT = 9
Const COLOR_INACTIVECAPTIONTEXT = 19
Dim SysColor(3) As Long Dim ColorValues(3) As Long
Dim Ret& SysColor(0) = COLOR_ACTIVECAPTION
   SysColor(1) = COLOR_INACTIVECAPTION
 SysColor(2) = COLOR_CAPTIONTEXT
SysColor(3) = COLOR_INACTIVECAPTIONTEXT ColorValues(0) = RGB(58, 158, 58) ’深綠 ColorValues(1) = RGB(93, 193, 93) ’淺綠 ColorValues(2) = 0 ’黑色 ColorValues(3) = RGB(126, 126, 126) ’灰色 Ret& = SetSysColors(4&, SysColor(0), ColorValues(0)) 該程序將改變所有活動(dòng)和非活動(dòng)窗口的標題欄背景和文本的顏色.
 
回調(CallBacks)   
     所謂回調,就是你自己定義一個(gè)函數,并告訴Windows何時(shí)為何調用.你可以寫(xiě)一個(gè)有特定數量和類(lèi)型參數的函數,然后告訴Windows何時(shí)調用,并傳遞給它所需的參數.Windows就會(huì )調用你定義的函數,處理參數,并給你返回值.
  回調的一個(gè)典型應用是從Windows獲得連續的數據流.這里是一個(gè)需要回調的函數的聲明:
Declare Function EnumWindows Lib "User32"ByVal lpEnumFunc As Long, ByVal lParam As Long) As Long   第一個(gè)參數是你的回調函數的地址,第二個(gè)參數是你想傳遞的的任意數值.該值將被傳遞到你的函數,于是你就知道了它要調用什么.
    VB 5.0已經(jīng)提供了一個(gè)很有用的操作符 AddressOf ,可以得到一個(gè)函數的地址.當你調用一個(gè)函數時(shí)它只能用在參數的前面,下面這種用法是錯誤的并且會(huì )導致出錯: FuncP = AddressOf MyFunction 因此你必須這樣調用EnumWindows函數: Success& = EnumWindows(AddressOf cbFunc, 58&)   你必須也要自己寫(xiě)回調函數.問(wèn)題是有很多不同類(lèi)別的回調并且有各種各樣的參數,有關(guān)這些參數的描述可以在SDK幫助或MS SDK文檔中找到.這里是一個(gè)
回調的聲明:
Function cbFunc (ByVal Hwnd, ByVal lParam) as Long
這里是一個(gè)回調的例子:
Private Declare Function GetWindowText Lib "user32" Alias "GetWindowTextA"(ByVal hwnd As Long,ByVal lpString As String,ByVal cch As Long) As Long Success& = EnumWindows(AddressOf cbFunc, 58&)
 
Function cbFunc (ByVal Hwnd, ByVal lParam) as Long
If lParam = 58 then ’enum windows Str$ = Space(255) Ret& = GetWindowText(Str$, Len(Str$))
 Debug.Print Left(Str$, Ret&)
End If
End Function
這個(gè)例子將列出窗口的標題,(不包含子窗體)
 
窗口程序
  Windows并不知道事件. 這些是VB特有的隱藏Windows獲取你的窗口發(fā)生事件的真正方法的一種方式.VB很像是一個(gè)將Windows語(yǔ)言翻譯成VB語(yǔ)言的解釋器.
  但是事實(shí)并非如此,你很快就會(huì )遇到.設想你想知道用戶(hù)何時(shí)加亮了菜單選項(不是點(diǎn)擊,只是加亮即選擇了)VB并不提供這種事件,但你可能見(jiàn)到其他的程序,但你瀏覽它的菜單時(shí)狀態(tài)欄會(huì )出現相應的文字.如果他們能,你為何不能?
  OK,這里是大致的真實(shí)情況.每個(gè)窗口都有一個(gè)特殊的程序叫做窗口程序.它實(shí)際上是一個(gè)回調函數.該函數將在你的窗口發(fā)生事件的任何時(shí)間發(fā)送消息.這樣當用戶(hù)加亮一個(gè)菜單項時(shí)就會(huì )發(fā)送一條消息(WM_COMMAND).
   那為什么我看不到這條消息呢?這是因為是VB創(chuàng )建窗口程序而不是你.當Windows發(fā)送消息時(shí),該程序將為之分派特定的事件,并將其參數轉換為比較容易用的事件的參數.但是在有些情況下,它會(huì )忽略有些消息而不能收到真實(shí)的輸入.如果你真的想得到這些消息,你必須對你的窗體進(jìn)行子類(lèi)處理,我們將在另外一個(gè)主題中談到.
這里是一個(gè)回調窗口程序的聲明:
 Function WindowProc(ByVal Hwnd As Long, ByVal wMsg As Long,ByVal wParam As Long, ByVal lParam As Long) As Long
  第一個(gè)參數指定窗口的句柄,第二個(gè)參數是消息的標識符(如WM_COMMAND或WM_MOUSEMOVE),wParam和lParam時(shí)兩個(gè)32位的數值,它們的意義依賴(lài)于消息的類(lèi)型.
 
子類(lèi)處理
  當你一最大限度利用了VB所給你的并且還想知道更多的東西,或只是想更多地了解你自己的窗口,你將會(huì )發(fā)現子類(lèi)處理的優(yōu)勢.
  子類(lèi)處理是指用一個(gè)新的窗口函數來(lái)取代當前活動(dòng)窗口函數.這個(gè)用戶(hù)自定義函數能處理任何需要的消息,并能調用原來(lái)的窗口函數,它將在原來(lái)的窗口函數之前收到各種消息.但原來(lái)的那個(gè)窗口處理函數依然存在,并沒(méi)有消失.如果你不想處理某條消息,你應該讓原來(lái)的窗口函數去處理它.
   子類(lèi)處理是通過(guò)調用SetWindowLong函數實(shí)現的,該函數將改變指定窗口的特殊屬性.下面是它的聲明:
Declare Function SetWindowLong Lib "user32" Alias "SetWindowLongA"(ByVal hwnd As Long, ByVal nIndex As Long,ByVal dwNewLong As Long) As Long
       第一個(gè)參數代表要進(jìn)行子類(lèi)處理的窗口,第二個(gè)參數應該是GWL_WNDPROC(-4),第三個(gè)參數是新的窗口函數的地址.參見(jiàn)回調和窗口函數一節. 此函數將在窗口取得焦點(diǎn),發(fā)生事件,或其他情況下(如其他進(jìn)程改變了系統的某些參數)被隨時(shí)調用. 如果發(fā)生錯誤SetWindowLong函數將返回0,否則將返回原來(lái)的窗口函數的地址.這個(gè)地址特別重要,你應該把它保存在一個(gè)變量中或其他地方.當你不處理某些消息時(shí)(實(shí)際上,你可能只處理不到1%的消息,其他的都將由原窗口函數處理),調用原來(lái)的窗口函數就需要該地址.
 
子類(lèi)處理
  當你一最大限度利用了VB所給你的并且還想知道更多的東西,或只是想更多地了解你自己的窗口,你將會(huì )發(fā)現子類(lèi)處理的優(yōu)勢.
   子類(lèi)處理是指用一個(gè)新的窗口函數來(lái)取代當前活動(dòng)窗口函數.這個(gè)用戶(hù)自定義函數能處理任何需要的消息,并能調用原來(lái)的窗口函數,它將在原來(lái)的窗口函數之前收到各種消息.但原來(lái)的那個(gè)窗口處理函數依然存在,并沒(méi)有消失.如果你不想處理某條消息,你應該讓原來(lái)的窗口函數去處理它.
  子類(lèi)處理是通過(guò)調用SetWindowLong函數實(shí)現的,該函數將改變指定窗口的特殊屬性.
下面是它的聲明:
Declare Function SetWindowLong Lib "user32" Alias "SetWindowLongA"(ByVal hwnd As Long, ByVal nIndex As Long,ByVal dwNewLong As Long) As Long
        第一個(gè)參數代表要進(jìn)行子類(lèi)處理的窗口,第二個(gè)參數應該是GWL_WNDPROC(-4),第三個(gè)參數是新的窗口函數的地址.參見(jiàn)回調和窗口函數一節. 此函數將在窗口取得焦點(diǎn),發(fā)生事件,或其他情況下(如其他進(jìn)程改變了系統的某些參數)被隨時(shí)調用. 如果發(fā)生錯誤SetWindowLong函數將返回0,否則將返回原來(lái)的窗口函數的地址.這個(gè)地址特別重要,你應該把它保存在一個(gè)變量中或其他地方.當你不處理某些消息時(shí)(實(shí)際上,你可能只處理不到1%的消息,其他的都將由原窗口函數處理),調用原來(lái)的窗口函數就需要該地址.
 
子類(lèi)處理
 
  調用原窗口函數將由CallWindowProc來(lái)完成.這里是它的聲明:
Declare Function CallWindowProc Lib "user32" Alias"CallWindowProcA"(ByVal lpPrevWndFunc As Long,ByVal hWnd As Long,ByVal Msg As Long,ByVal wParam As Long, ByVal lParam As Long) As Long
  第一個(gè)參數是原窗口函數的地址,其他的同你接收到的四個(gè)參數一樣.你可以改變其中的值來(lái)控制對消息的處理.例如,當你收到了一條WM_MOUSEMOVE消息時(shí),你從lParam中得到鼠標所在位置的坐標并將其改成了其他的坐標.那么原窗口函數就會(huì )認為鼠標位于其他的位置從而做出一些有趣的事如顯示其他控件的Tooltip.
  你指定的返回值也是有意義的,它依賴(lài)于發(fā)送的消息. 在結束你的程序時(shí)將控制權交回給原窗口函數是很重要的,通常在Form_Unload中完成如下: Ret& = SetWindowLong(Me.Hwnd, GWL_WNDPROC, oldWndProcAddress) 如果你在VB中啟動(dòng)程序時(shí)忘掉了這一行,結果將是VB崩潰并會(huì )丟失尚未保存的數據.千萬(wàn)要小心.
這里是子類(lèi)處理的一個(gè)簡(jiǎn)單示例:
 
Dim oldWndProc As Long
Private Sub Form_Load()
oldWndProc = SetWindowLong(Me.Hwnd, GWL_WNDPROC, AddressOf MyWndProc)
End Sub
 
Private Sub Form_Unload()
Ret& = SetWindowLong(Me.Hwnd, GWL_WNDPROC, oldWndProc)
End Sub
 
Function MyWndProc(ByVal Hwnd As Long,ByVal wMsg as Long,ByVal wParam As Long,ByVal lParam As Long)
Debug.Print wMsg & " " & wParam & " " & lParam Ret& = CallWindowProc(oldWndProc, Hwnd, wMsg, wParam, lParam)
End Function
 
處理參數
 
 有時(shí)函數并不以你所需的方式返回信息.一個(gè)典型的例子是將兩個(gè)代表鼠標位置的整形(2 byte)數合并為一個(gè)4 Byte的數.還有一個(gè)例子是判斷一個(gè)數的某位是否為1.你還可能得到一個(gè)代表一個(gè)結構地址的Long型數.
  合并和分離一個(gè)數并不需要過(guò)多的描述.你能在我們的網(wǎng)站(www.geocities.com/SiliconValley/Lab/1632/)上找到APIMacro.bas,它包含了你需要的多種函數. 可以用一下方法檢查一個(gè)數的第N位是否為1: If Value and (2^N) then ... 置1 Value = Value Or 2^N 置0 Value = Value And Not 2^N
  如果你想設定或取得預先知道的某位的信息,用1024代替2^10要快的多.因為這樣VB無(wú)需自己進(jìn)行計算(VB憎恨 "^" ?).
  如果你接收到一個(gè)類(lèi)型的指針,你要做的工作將稍多一點(diǎn).你可以使用CopyMem函數來(lái)取得信息.下面是它的聲明: Declare Sub CopyMem Lib "kernel32" Alias "RtlMoveMemory" (pDest As Any, pSource As Any, ByVal ByteLen As Long) 如果你接收到了一個(gè)指向RECT 類(lèi)型的指針并存在Long型變量Addr 中,可以這樣處理: Dim Info As Rect Call CopyMem(Info, ByVal Addr, len(Info)) 注意ByVal關(guān)鍵字.現在,如果你想把信息寫(xiě)回,使用: Call CopyMem(ByVal Addr, Info, Len(Info))
 
結束語(yǔ)   我希望這份教程能幫助你理解如何控制API函數的威力和如何正確使用它們.但是要小心!就像火,如果你讓它失去控制,你就會(huì )玩蛋.當然,不要忘了VB是進(jìn)行簡(jiǎn)單.安全程序設計的語(yǔ)言,而API函數則正好相反.如果你想得到更多的控制功能,最好轉移到VC++ 或者Delphi.   祝你在A(yíng)PI探險中好運!
 
本站僅提供存儲服務(wù),所有內容均由用戶(hù)發(fā)布,如發(fā)現有害或侵權內容,請點(diǎn)擊舉報。
打開(kāi)APP,閱讀全文并永久保存 查看更多類(lèi)似文章
猜你喜歡
類(lèi)似文章
用VB模擬鍵盤(pán)事件的N種方法
VB api 中級
VB5中回調函數的使用方法
API手冊
vc vb dll 參數傳遞
VB.net 讀寫(xiě)內存問(wèn)題
更多類(lèi)似文章 >>
生活服務(wù)
分享 收藏 導長(cháng)圖 關(guān)注 下載文章
綁定賬號成功
后續可登錄賬號暢享VIP特權!
如果VIP功能使用有故障,
可點(diǎn)擊這里聯(lián)系客服!

聯(lián)系客服

欧美性猛交XXXX免费看蜜桃,成人网18免费韩国,亚洲国产成人精品区综合,欧美日韩一区二区三区高清不卡,亚洲综合一区二区精品久久