• <ruby id="5koa6"></ruby>
    <ruby id="5koa6"><option id="5koa6"><thead id="5koa6"></thead></option></ruby>

    <progress id="5koa6"></progress>

  • <strong id="5koa6"></strong>
  • VB的API編程精粹(二)

    發表于:2007-05-25來源:作者:點擊數: 標簽:編程api精粹說到底一節
    第一節:API基礎 API說到底就是一系列的底層函數,是系統提供給 用戶用于進入操作系統核心,進行高級編程的途徑。通 過在Visual Basic應用程序中聲明外部過程就能夠 訪問Windows API(以及其它的外部DLLs)。在聲明 了過程之后,調用它的方法與調用Visual Basi

    第一節:API基礎
    API說到底就是一系列的底層函數,是系統提供給 用戶用于進入操作系統核心,進行高級編程的途徑。通 過在Visual Basic應用程序中聲明外部過程就能夠 訪問Windows API(以及其它的外部DLLs)。在聲明 了過程之后,調用它的方法與調用Visual Basic自 己的過程相同。要聲明一個DLL過程,需要在代碼窗 口的"聲明"部分增加一個Declare語句,如果該過 程返回一個值,應將其聲明為Function。例如:
    Declare Function publicname Lib "libname" [Alias "alias"] [([[ByVal] variable [As type] [,[ByVal] variable [As type]]...])] As Type
    如果過程沒有返回值,可將其聲明為Sub。
    缺省情況下,在標準模塊中聲明的DLL過程,可 以在應用程序的任何地方調用它。在其他類型的模塊 中定義的DLL過程是模塊私有的,必須在它們前面 加上Private關鍵字,以示區分。特別提請注意的 是,在32位的Visual Basic中過程名是區分大小 寫的。而在以前的16位版本中并不區分大小寫,這 是初學者容易出錯的地方。
    Declare語句中的Lib子句用來告訴Visual Basic如何找到包含該過程的dll文件。如果引用的過 程屬于Windows核心庫(User32、Kernel32或 GDI32),則可以不包含文件擴展名。例如:
    Declare Function GetTickCount Lib "kernel32" Alias "GetTickCount"() As Long。對于其它DLL, Lib子句須指定文件的路徑及擴展名。
    如果調用的Windows API過程要使用字符串,那 么在聲明語句中必須增加一個Alias子句,以指定 正確的字符集。包含字符串的Windows API函數實 際有兩種格武ANSI格式Unicode格式。因此,在 Windows頭文件中,每個包含字符串的函數都同時有 ANSI版本和Unicode版本。
    例如,下面是SetWindowText函數的兩種C語言描 述??梢钥吹?,第一個描述將函數定義為SetWindowTextA, 尾部的"A"表明它是一個ANSI函數:
    SetWindowTextA(HWND hWnd,LPCSTR lpString);
    第二個描述將它定義為SetWindowTextW,尾部的 "w"表明它是一個Unicode函數:
    SetWindowTextW(HWND Hwnd,LPCWSTR lpString);
    因為兩個函數實際的名稱都不是"SetWindow Text",要引用正確的函數就必須增加一個Alias子句:
    Private Declare Function SetwindowText Lib "user32" Alias "SetWindowTextA"(ByVal hwnd As Longg,ByVal lpString As String) As Long
    請注意, Alias子句后面的字符串必須是過程的 真正名稱,必須是區分大小寫的。事實上,您只需要 記住,只有Windows NT才支持Unicode格式,而 Windows 95只支持ANSI格式就行了。至于兩者的區 別,作一般的應用程序開發是不需要了解的。
    VB5專業版在VB目錄的\Winapi子目錄下,用幾 個文件提供了關于API的信息。 Win32api.txt文件中 包含了32位Windows API函數中用到的函數和類型的 結構聲明以及全局常量的值。用戶可以用VB本身帶的外 接程序"API瀏覽器"來方便地使用Win32api.Txt,如下 所示:
    點擊菜單文件項的"加載文本文件…"從VB目 錄下的WINAPI目錄中選擇"WIN32API.TXT",就可以 查看WINDOWS 95系統的API函數的聲明、常數定義和 數據類型了。例如,我們打算查看函數InverRect() 的聲明。首先,點擊"搜索"按鈕,輸入字符串 "InverRect"。在"可選項"欄中,蘭色的亮度條將移 動到"InverRect"項上。再點按"添加"按鈕,在"選 定項"中就出現"InverRect"在Visual Basic中的 聲明了。接下來自然是點按"復制"按鈕,然后將窗 口切換到Visual Basic開發環境中,在需要聲明API 函數的地方Ctrl+V(粘貼)即可。
    上面所講的聲明方法雖然簡單,但只有使用WIN DOWS本身的API函數才能這樣。對于第三方提供的動 態鏈接庫(DLL)您只有用鍵盤老老實實地敲了。
    第二節:牛刀小試
    現在讀者一定很想自己親自試一下,下面舉兩個 實際應用的例子讓大家體會一下API的妙用吧!
    1.使一個窗體始終保持在屏幕的最上面
    我們知道VB本身自帶的函數是難以完成此功能 的,我們可以通過調用Windows的API函數: SetWindowPos達到我們的要求。操作步驟如下:
    (1)啟動VB5建立一個新工程,在該工程中添加一 個模塊(Moudel),在該模塊中用上述的"API例覽器" 添加如下的該API函數的函數聲明和常量聲明部分:
    'API函數聲明
    Declare Function SetWindowPos Lib "user32" Alias "SetWindowPos" (ByVal hwnd As Long, ByVal hWndInsertAfter As Long, ByVal x As Long, ByVal y As Long, ByVal cx As Long, ByVal cy As Long, ByVal wFlags As Long) As Long
    '常量聲明
    Global Const SWP_HIDEWINDOW = &H80
    Global Const SWP_NOACTIVATE = &H10
    Global Const SWP_NOCOPYBITS = &H100
    Global Const SWP_NOMOVE = &H2
    Global Const SWP_NOOWNERZORDER = &H200
    Global Const SWP_NOREDRAW = &H8
    Global Const SWP_NOREPOSITION = SWP_NOOWNERZORDER
    Global Const SWP_NOSIZE = &H1
    Global Const SWP_NOZORDER = &H4
    Global Const SWP_SHOWWINDOW = &H40
    Global Const HWND_BOTTOM = 1
    Global Const HWND_BROADCAST = &HFFFF&
    Global Const HWND_DESKTOP = 0
    Global Const HWND_NOTOPMOST = -2
    Global Const HWND_TOPMOST = -1
    Global Const HWND_TOP = 0
    Global Const Flags=SWP_NOMOVE Or SWP_NOSIZE
    這里以"SWP_"開頭的常量是表示窗體所具有的 風格,這些常量可以通過VB中的"OR"操作符組合在 一起。而以"HWND_"開頭的常量表示窗體在桌面上的 位置。從這些常量的英文單詞的意義上讀者應該很容 易理解他們所具有的風格了。所以筆者就不一一去說 明了。至于為什么要添加這些常量而不是別的這就要 您去查看Windows SDK關于該函數的幫助文檔了。當 然這對于初學者來說有一定的難度,但不要畏懼,只 要您仔細看幫助就會慢慢搞懂的。因為這些API函數 是為C和C++的編程人員編寫的,所以如果您懂一點 C++的話會很容易理解的。
    (2)現在只要在您想要此功能的地方調用該函數 就可以了,調用的方法如:
    Dim Success as Long
    SuccesS=SetwindowPos(me.HWnd. HWND_TOPMOST,0,0,0,0,FLAGS)
    若Success返回的值不等于零則表示調用成功。
    比如在某個窗體的Load事件中加入上述的兩行代 碼,就可以達到使該窗體始終位于屏幕最上面的目的。
    細心的讀者可能已經發現上面的例子中的模塊聲 明中聲明了好幾個常量,可為什么只用到三個呢?現 在您可以試著改變一下API函數"SetWindowPos"中 的第二個參數或常量FLAGS中的項,看看您的窗體會 出現什么樣的效果?
    2.VB5中如何屏蔽掉win95中的CTRL_ALT_DEL, CTRL_ESC, ALT_TAB三組熱鍵通過調用API函數"SystemParametersInfo"來實 現。
    首先創建一新工程;在此工程中添加一個窗體和 一個模塊;在窗體上拖放兩個按鈕分別命名為 "cmdDisable","cmdEnable";Copy如下代碼入模塊中:
    Public Declare Function SystemParametersInfo Lib "user32" Ahias "SystemParametersInfoA" (ByVal uAction As Long,ByVal uParam As Long, lpvParam As Any,ByVal fuWinIni As Long)AS Long
    Public Const SPI_SCREENSAVERRUNNING=97
    在窗體的代碼編輯區Copy如下代碼:
    '使三組熱鍵失效
    Private Sub cmdDisable_click()
    SystemParametersInfo
    SPI_SCREENSAVERRUNNING,True,byVal 1&,0
    End Sub

    Private Sub Form_Unload(Cancel As Integer)
    '程序退出前是熱鍵有效
    CndEnable_Click
    End Sub
    若將此功能和屏幕保護程序結合到一起,那您的屏幕 保護程序一定增色許多。
    API函數的簡單調用例子就是這么容易,相信現在您 對API的調用已不再感到神秘了,接下來我們就看看一個 比較復雜的應用。
    第三節:高手進階
    上面的關于API的調用的例子只是為了帶您去Win dows API世界中去探索一下。相信您已探索到了一點眉 目并想去實現一些更"好玩"的東西了。好!下面就向您 介紹一個很"好玩"同時又會使您的程序看起來更專業化 的一個API調用。
    相信您的機器上一定裝有"金山詞霸",試著啟動它 您發現了什么?啟動畫面過后它"不見了"。把鼠標移到 桌面的右下角,原來它以圖標的形式"藏在" Windows 的托盤中。用鼠標右擊它還會彈出一個菜單功能項供您 選擇?,F在您一定想把自己的程序也放到托盤,這樣您的 程序多具有專業水準!
    下面是此功能的實現步驟:
    1.這里我們調用的API函數是: "Shell_NotifyIcon",在您的模塊中添加如下的函數聲明 和常量聲明:
    '以下常量告訴系統在托盤中您的圖標上發生了什么 操作
    '常量聲明
    Public Const WM_MOUSEMOVE = &H200 '在圖標上移動鼠標
    Public Const WM_LBUTTONDOWN = &H201 '鼠標左鍵按下
    Public Const WM_LBUTTONUP = &H202 '鼠標左鍵釋放
    Public Const WM_LBUTTONDBLCLK = &H203 '雙擊鼠標左鍵
    Public Const WM_RBUTTONDOWN = &H204 '鼠標右鍵按下
    Public Const WM_RBUTTONUP = &H205 '鼠標右鍵釋放
    Public Const WM_RBUTTONDBLCLK = &H206 '雙擊鼠標右鍵
    Public Const WM_SETHOTKEY = &H32 '響應您定義的熱鍵
    'API函數聲明
    Public Declare Function Shell_NotifyIcon Lib "shell32.dll" Alias " Shell_NotifyIconA" (ByVal dwMessage As Long, lpData As NOTIFYICONDATA) As Long
    '自定義一個調用API Shell_NotifyIcon要用到的類 型"NOTIFYICONDATA"
    Public Type NOTIFYICONDATA
    cdSize As Long 'NOTIFYICONDATA類型的大小
    hwnd As Long '你的應用程序窗體的名柄
    uId As Long '應用程序圖標資源的ID號
    uFlags As Long '使那些參數有效它是以下枚舉類型中的
    'NIF_MESSAGE、NIF_ICON、NIF_TIP三組的組合
    uCallbackMessage As Long '鼠標移動時把此消息發給該圖標的窗體
    hIcon As Long '圖標名柄
    szTip As String*64 '當鼠標在圖標上時顯示的Tip文本
    End Type

    '這是一個枚舉類型它告訴API Shell_NotifyIcon去做什么操作
    Public Enum enm_NIM_Shell
    NIM_ADD=&H40 '在“金碟”中加一圖標
    NIM_MODIFY=&H1 '修改“金碟”中的圖標
    NIM_DELETE=&H2 '刪除“金碟”中的圖標
    NIF_MESSAGE=&H1 '使類型"NOTIFYICONDATA"中的uCallbackMessage有效
    NIF_ICON=&H2 '使類型"NOTIFYICONDATA"中的hIcon有效
    NIF_TIP=&H4 '使類型"NOTIFYICONDATA"中的szTip有效
    WM_MOUSEMOVE=&H200 '使鼠標移動消息有效
    End Enum
    '定義一個"NOTIFYICONDATA"類型的變量
    Public nidProgramData As NOTIFYICONDATA
    以上是函數及常量聲明和自定義的一個類型變量,下 面是此API函數的調用方法:
    2. 在窗體上用菜單編輯一個具有如下信息的菜單項:
    主菜單:無標題、名稱(mainMenu)
    子菜單:標題(API編程)、名稱(submnul);
    標題(退出)、名稱(submnu2).
    這里只是舉個例子,具體的功能你可以根據你的具體需要來編輯此菜單項
    3. 在窗體的Load事件中添加如下代碼:
    Private Sub Form_Load()
    '隱藏窗體
    With Me
    .Top =-10000
    .Left = -10000
    .WindowState = vbMinimized
    End With
    '設置類型NOTIFYICONDATA所具有的特征
    With nidprogramData
    .cbSize = Len(nidProgramData)
    .hwnd = Me.hwnd .uld = vbNull
    .uFlags = NIF_ICON Or NIF_TIP Or NIF_MESSAGE
    '觸發鼠標移動消息
    .uCallbackMessage = WM_MOUSEMOVE
    .hIcon = Me.Icon '“托盤”中放入窗體圖標,你可以把窗體的圖標換成你所喜歡的圖標
    .szTip ="VB 的 Win32 API 編程" & vbNullChar
    End With

    '調用該函數
    Shell_NotifyIcon NIM_ADD,nidprogramData
    End Sub
    '根據不同的鼠標消息做不同的操作
    Private Sub Form_MouseMove(Button As inte ger, Shift As lnteger, x As Single, Y As Single)
    On Error GoTo Form_MouseMove_err:
    Dim Result As Long
    Dim msg As Long
    'X的值依賴與顯示模式的設置
    If Me.ScaleMode = vbpixels Then
    msg = x
    Else
    msg = x/Screen.TwipsPerPixe1X
    End If
    Select Case msg
    Case WM_LBUTTONUP
    '在這里加入鼠標左鍵釋放時你想做的操作
    Case WM_LBUTTONDBLCLK
    '在這里加入雙擊鼠標左鍵時你想做的操作
    Case WM_RBUTTONUP
    '通常這里彈出你的功能菜單
    PopupMenu mainMenu
    Case WM_MOUSEISMOVING
    '在這里加入鼠標正在移動時你想做的操作
    End Select
    Exit Sub

    Form_MouseMove_err:
    '在這里加入你的處理異常錯誤的代碼
    End Sub
    4.Run你的程序,您是不是看到了象“金山詞霸”一樣的功能?相信你此時的感覺一定特別“爽”!

     

    原文轉自:http://www.kjueaiud.com

    老湿亚洲永久精品ww47香蕉图片_日韩欧美中文字幕北美法律_国产AV永久无码天堂影院_久久婷婷综合色丁香五月

  • <ruby id="5koa6"></ruby>
    <ruby id="5koa6"><option id="5koa6"><thead id="5koa6"></thead></option></ruby>

    <progress id="5koa6"></progress>

  • <strong id="5koa6"></strong>