文章內文:
VB寫程式基礎課
什麼是API API文字遊覽器
API函數聲明 資料類型與"類型安全"
常 數 結 構
小 結 一些API函數集: 控件與消息函數、硬體與系統函數、選單函數、繪圖函數
什麼是API
首先,有必要向大家講一講,什麼是API。所謂API本來是為C和C++程式員寫的。API說來說去,就是一種函數,他們包括在一個附加名為DLL的動態連線庫檔案中。用標準的定義來講,API就是Windows的32位套用程式寫程式接口,是一系列很複雜的函數,消息和結構,它使寫程式人員可以用不同類型的寫程式語系編製出的執行在Windows95和Windows NT動作系統上的套用程式。可以說,若果你曾經學過VC,那麼API對你來說不是什麼問題。但是若果你沒有學過VC,或是你對Windows95的結構體系不熟悉,那麼可以說,學習API將是一件很辛苦的事情。
若果你開啟WINDOWS的SYSTEM資料夾,你可以發現其中有很多附加名為DLL的檔案。一個DLL中包括的API函數並不只是一個,數十個,甚至是數百個。我們能都掌握它嘛?回答是否定的︰不可能掌握。但實際上,我們真的沒必要都掌握,只要重點掌握Windos系統本身自帶的API函數就可以了。但,在其中還應當拋開掉同VB本身自有的函數重複的函數。如,VB
的etAttr指令可以獲得檔案屬性,SetAttr可以設定檔案屬性。對API來講也有對應的函數
GetFileAttributes和SetFileAttributes,效能都差不多。如此地一算,剩下來的也就5、600個。是的,也不少。但,我可以敢跟你說,只要你熟悉地掌握100個,那麼你的寫程式水平比現在高出至少要兩倍。儘管人們說VB和WINDOWS具有密切的關係,但我認為,API更接近
WINDOWS。若果你學會了API,首要的收穫便是對WINDOWS體系結構的認識。這個收穫是來自不易的。
若果你不依靠API會怎麼樣?我可以跟你說,絕大多是進階寫程式書本(當然這不是書的名程叫進階而進階的,而是在一開始的《本書內容》中指明《本書的閱讀對象是具有一定VB基礎的讀者》的那些書),首先提的問題一般大都是從API開始。因此可以說,你不學API,你大概將停留在初級水平,無法往上攀登。唯一的途徑也許就是向別人求救︰我快死了,快來救救我呀,這個怎麼辦,那個怎麼辦?煩不煩呢?當然,現在網上好人太多(內含我在內,嘻嘻),但,你應當明白,通過此途徑,你的手中出不了好的作品。這是因為缺乏這些知識你的腦子裡根本行不成一種總體的設計構思。
API文字遊覽器 [返回]
很多API函數都是很長很長的。想看什麼樣子嗎?如下就是作為例子的API DdeClientTransaction函數︰
Declare Function DdeClientTransaction Lib "user32" (pData As Byte, ByVal cbData As Long, ByVal hConv As Long, ByVal hszItem As Long, ByVal wFmt As Long, ByVal wType As Long, ByVal dwTimeout As Long, pdwResult As Long) As Long
哇!這麼長?若果你從來沒有接觸過API,我想你肯定被嚇住了。你也許考慮,該不該繼續學下去。不過不要擔心,幸運的是Microsoft的設計家們為我們提供了有用的工具,這便是API
文字檢視器。
通過API文字檢視器,我們可以方便地尋找程式所需要的函數聲明、結構類型和常量,然後將它複製到剪貼簿,最後再貼上到VB程式的代碼段中。在大多數情況下,只要我們確定了程式所需要的函數、結構和常量這三個方面後,就可以通過對API文字遊覽器的以上動作將他們加入到程式段中,從而程式中可以使用這些函數了。這些是學習API最基本的常識問題,它遠遠佔不到API的龐大的體系內容。今後我們把精力浪費(這絕不是浪費)在哪裡呢?那就是︰
什麼時候使用什麼函數,什麼時候使用什麼結構類型,什麼時候使用什麼常量。
API函數聲明
讓我們回想一下。在VB中,如何聲明函數呢?我想,若果你正在看此文,那麼你絕對能夠回答得出這個問題。以下便是你應該很熟悉的函數聲明︰
Function SetFocus (ByVal hwnd As Long) As Long
即,這行代碼定義了名為SetFocus的函數,此函數具有一個Long型資料類型的參數,並按值傳遞(ByVal),函數執行後將返回一個Long型資料。
API函數的聲明也很類似,如,API中的SetFocus 函數是這樣寫的︰
Declare Function SetFocus Lib "user32" Alias "SetFocus" (ByVal hwnd As Long) As Long
有點複雜了一些。是的,是複雜了點。但我可以告訴你,除了這些多出來的部分,其他部分還是和你以前學到的東西是一樣的。函數在程式中的呼叫也是一樣。如:
Dim dl As Long
dl&=SetFoucs(Form1.Hwnd)
但,一點是清楚的。它不像你自己寫的程式那樣能夠看到裡面的執行機理,也不像VB
自帶的函數那樣,能夠從VB的聯機幫助中查到其用法。唯一的方法就是去學、查VB以外的資料。
Declare 語句用於在模組層級中聲明對動態連結庫 (DLL) 中外部過程的引用。對此,你只要記住任何API函數聲明都必須寫這個語句就可以了。
Iib 指明包括所聲明過程或函數的動態連結庫或代碼資源。也就是說,它說明的是,函數或過程從何而來的問題。
如在上例中,SetFocus Lib "user32"說明 函數 SetFocus 來自 user32.dll檔案。主要的dll動態連線庫檔案有︰
user32.dll Windows管理。生成和管理套用程式的使用者接口。
GDI32.dll 圖形裝置接口。產生Windows裝置的圖形輸出
Kernel32.dll 系統服務。訪問動作系統的電腦資源。
注意,當DLL檔案不在Windows或System資料夾中的時候,必須在函數中說明其出處(
路徑)。如,SetFocus Lib "c:\Mydll\user32"
函數聲明中的Alias 是可選的。表示將被呼叫的過程在動態連結庫 (DLL) 中還有另外的名稱(別名)。如,Alias "SetFocus" ,說明SetFocus函數在User32.dll中的另外一個名稱是,
SetFocus。怎麼兩個名都一樣呢?當然,也可以是不同的。在很多情況下,Alias說明的函數名,即別名最後一個字元經常是字元A,如SetWindowsText函數的另一個名稱是
SetWindowsTextA,表示為Alias "SetWindowsTextA"。這個A只不過是設計家們的習慣的命名約定,表示函數屬於ANSI版本。
那麼,別名究竟有什麼用途呢?從理論上講,別名提供了用另一個名子呼叫API的函數方法。若果你指明了別名,那麼儘管我們按Declare語句後面的函數來呼叫該函數,但在函數的實際呼叫上是以別名作為首要選取的。如,以下兩個函數(Function,ABCD)聲明都是有效的,他們呼叫的是同一個 SetFocus函數︰
Declare Function SetFocus Lib "user32" "SetFocus" (ByVal hwnd As Long) As Long
Declare ABCD SetFocus Lib "user32" Alias "SetFocus" (ByVal hwnd As Long) As Long
需要注意的是,選用Alias的時候,應注意別名的大小寫;若果不選用Alias 時的時候,函數名必須注意大小寫,而且不能改動。當然,在很多情況下,由於函數聲明是直接從API
文字遊覽器中複制過來的,所以這種錯誤的發生機會是很少的,但您有必要知道這一點。
最後提醒你一句,API聲明(內含結構、常量)必須放在窗體或模組的"通用(General Declarations)段。
資料類型與"類型安全"
API函數中使用的資料類型基本上和VB中的一樣。但作為WIN32的API函數中,不存在Integer
資料類型。另外一點是在API函數中看不到Boolean資料類型。 Variant資料類型在API函數中是以Any的形式出現,如Data As Any。儘管其含義是容許任意參數類型作為一個該API函數的參數傳遞,但這樣做存在一定的缺點。其原因是,這將會使得對目的參數的所有類型檢查都會被關閉。這自然會給各種類型的參數呼叫帶來了產生錯誤的機會。
為了強制執行嚴格的類型檢查,並避免上面提到的問題,一個辦法是在函數里使用上面提到到Alias技術。如對API函數 GetDIBits 可進行另外一種聲明方法。如下︰
GetDIBits函數的原型︰
Public Declare Function GetDIBits Lib "gdi32" Alias "GetDIBits" (ByVal aHDC As Long, ByVal hBitmap As Long, ByVal nStartScan As Long, ByVal nNumScans As Long, lpBits As Any, lpBI As BITMAPINFO, ByVal wUsage As Long) As Long
GetDIBits函數的改型︰
Public Declare Function GetDIBitsLong Lib "gdi32" Alias "GetDIBits" (ByVal aHDC As Long, ByVal hBitmap As Long, ByVal nStartScan As Long, ByVal nNumScans As Long, lpBits As Long, lpBI As BITMAPINFO, ByVal wUsage As Long) As Long
通過本課程前面所學到的知識,我們已經可以得知原型 GetDIBits函數也好,改型 GetDIBitsLong函數也好,實際將呼叫的都是Alias所特殊的 GetDIBits原函數。但你應當看到,兩者的區別在於,我們在改型的函數中強制指定lpBits參數為Long形。這樣就會使得函數呼叫中發生的錯誤機率減少到了最小。這種方法叫做"安全類型"聲明。
API函數中經常看到的資料類型有︰Long,String,Byte,Any....(也就這些吧。)
常 數
對於API常量來講,沒有什麼太特別的學問。請看VB中的以下代碼︰
Msg = MsgBox("您好", vbOKCancel)
我們知道, vbOKCancel這個常量的值等於1。對上面的代碼我們完全可以這樣寫,而不會影響代碼的功能︰
Msg = MsgBox("您好", 1)
但你大概不太願意選取後一種,因為這會使得看懂代碼費勁起來。這種方法也被API採取了。只是API常量必須在事情之前做好起始化聲明VB本身是看不懂的。其內容仍然來自與API
文字遊覽器。具體形式如下等等︰
Public Const ABM_ACTIVATE = &H6
Public Const RIGHT_CTRL_PRESSED = &H4
Public Const RPC_E_SERVER_DIED = &H80010007
Private Const RPC_S_CALL_FAILED_DNE = 1727&
在常量的起始化中,有些程式使用Global,如Global Const ABM_ACTIVATE = &H6,但我認為Public完全可以代替它。過去我也用過Global,但現在不大用了。一會兒用這個,一會兒用那個,各程式之間不能保持一致性了,起碼看起來彆扭。
結 構 [返回]
結構是C和C++語系中的說法。在VB中一般稱為自訂資料類型。想必很多朋友都已經認識它。在API領域裡,我更喜歡把它叫做結構,因為API各種結構類型根本不是我定義(
自訂)的。
在VB中,API結構同樣由TYPE.......END TYPE語句來定義。如,在API中,點(Point)結構的定義方法如下:
Public Type POINTAPI
X As Long '點在X坐標(橫坐標)上的坐標值
Y As Long '點在Y坐標(縱坐標)上的坐標值
End Type
又如,API中矩形(Rect)結構的定義如下︰
Public Type RECT
Left As Long '矩形左上角的X坐標
Top As Long '矩形左上角的Y坐標
Right As Long '矩形右下角的X坐標
Bottom As Long '矩形右下角的Y坐標
End Type
這些內容同樣可以從API文字遊覽器中複制過來。這些結構中的變量名可隨意改動,而不會影響結構本身。也就是說,這些成員變量都是虛擬的。如,POINTAPI結構可改為如下︰
Public Type POINTAPI
MyX As Long '點在X坐標(橫坐標)上的坐標值
MyY As Long '點在Y坐標(縱坐標)上的坐標值
End Type
不過,一般來講,是沒有這種必要的。結構本身是一種資料類型,因此,使用時必須聲明具體變量為該結構型,才能在程式中真正使用到該結構。結構的聲明方法和其他資料的聲明方法一樣,如,以下語句把變MyPoint聲明為POINTAPI結構類型︰
MyPoint As POINTAPI
引用結構中的成員變量也十分簡單,在結構名後面加上一個".",然後緊接著寫要引用的成員變量即可。這很像VB中的引用一個對象的某個屬性。如,假如我們把上面已經聲明的MyPoint結構中的X變量的值賦給變量Temp&
則代碼如下︰
Temp&=MyPoint.X
但,特別注意的是,你千萬不要認為上例中的MyPoint是一個值。它不是值,而是位址(
指標)。值和位址是完全不同的概念。結構要求按引用傳遞給WINDOWS函數,即所有API
函數中,結構都是按ByRef傳遞的(在Declare語句中ByRef是預設型)。對於結構的傳遞,你不要試圖採用ByVal,你將一無所獲。由於結構名實際上就是指向這個結構的指標(這個結構的首位址),所以,你也就傳輸特定的結構名就可以了(參見小結,我用紅色字型來突出了這種傳遞模式)。
由於結構傳輸的是指標,所以函數將直接對結構進行讀寫動作。這種特性很適合於把函數執行的結果裝載在結構之中。
小 結 [返回]
以下的程式是為了總結本課國中到的內容而給出的。啟動VB,新增一個項目,加入一個指令按鈕,並把下面的代碼複制到代碼段中,執行它。
Private Declare Function GetCursorPos Lib "user32" (lpPoint As POINTAPI) As Long
Private Type POINTAPI '定義點(Point)結構
X As Long '點在X坐標(橫坐標)上的坐標值
Y As Long '點在Y坐標(縱坐標)上的坐標值
End Type
Sub PrintCursorPos( )
Dim dl AS Long
Dim MyPoint As POINTAPI
dl&= GetCursorPos(MyPoint) '呼叫函數,取得螢幕滑鼠坐標
Debug.Print "X=" & Str(MyPoint.X) & " and " & "Y=" & Str(MyPoint.Y)
End Sub
Private Sub Command1_Click()
PrintCursorPos
End Sub
輸出結果為(每次執行都可能得到不同的結果,這得由函數呼叫時滑鼠指標在螢幕中所處的位置而決定)︰
X= 240 and Y= 151
程式中,GetCursorPos函數用來取得滑鼠指標在螢幕上的位置。
以上例子中,你可以發現,以參數傳遞的MyPpint結構的內容在函數呼叫後發生了實質性變化。這是由於結構是按ByRef傳遞的原因。
一些API函數集 [返回]
Windows API
1.控件與消息函數
AdjustWindowRect 給定一種視窗型態,計算獲得目的客戶區矩形所需的視窗大小
AnyPopup 判斷螢幕上是否存在任何跳出式視窗
ArrangeIconicWindows 排序一個父視窗的最小化子視窗
AttachThreadInput 連線執行緒輸入函數
BeginDeferWindowPos 啟動構建一系列新視窗位置的過程
BringWindowToTop 將特殊的視窗帶至視窗清單頂部
CascadeWindows 以層疊模式排序視窗
ChildWindowFromPoint 返回父視窗中包括了指定點的第一個子視窗的控制碼
ClientToScreen 判斷視窗內以客戶區坐標表示的一個點的螢幕坐標
CloseWindow 最小化特殊的視窗
CopyRect 矩形內容複製
DeferWindowPos 該函數為特定的視窗指定一個新視窗位置
DestroyWindow 清除特殊的視窗以及它的所有子視窗
DrawAnimatedRects 描繪一系列動態矩形
EnableWindow 特殊的視窗裡容許或禁止所有滑鼠及鍵盤輸入
EndDeferWindowPos 同時更新DeferWindowPos呼叫時特殊的所有視窗的位置及狀態
EnumChildWindows 為特殊的父視窗枚舉子視窗
EnumThreadWindows 枚舉與指定任務關聯的視窗
EnumWindows 枚舉視窗清單中的所有父視窗
EqualRect 判斷兩個矩形結構是否相同
FindWindow 尋找視窗清單中第一個符合指定條件的頂級視窗
FindWindowEx 在視窗清單中尋找與指定條件相符的第一個子視窗
FlashWindow 閃爍顯示指定視窗
GetActiveWindow 獲得活動視窗的控制碼
GetCapture 獲得一個視窗的控制碼,這個視窗位於目前輸入執行緒,且擁有滑鼠捕獲(滑鼠活動由它接收)
GetClassInfo 取得WNDCLASS結構(或WNDCLASSEX結構)的一個副本,結構中包括了與指定類有關的訊息
GetClassLong 取得視窗類的一個Long變量條目
GetClassName 為特殊的視窗取得類名
GetClassWord 為視窗類取得一個整數變量
GetClientRect 返回指定視窗客戶區矩形的大小
GetDesktopWindow 獲得代表整個螢幕的一個視窗(桌面視窗)控制碼
GetFocus 獲得擁有輸入焦點的視窗的控制碼
GetForegroundWindow 獲得前台視窗的控制碼
GetLastActivePopup 獲得在一個給定父視窗中最近啟用過的跳出式視窗的控制碼
GetLastError 針對之前呼叫的api函數,用這個函數取得延伸錯誤訊息
GetParent 判斷指定視窗的父視窗
GetTopWindow 搜尋內定視窗清單,尋找隸屬於指定視窗的頭一個視窗的控制碼
GetUpdateRect 獲得一個矩形,它描敘了指定視窗中需要更新的那一部分
GetWindow 獲得一個視窗的控制碼,該視窗與某源視窗有特定的關係
GetWindowContextHelpId 取得與視窗關聯在一起的幫助場景ID
GetWindowLong 從指定視窗的結構中取得訊息
GetWindowPlacement 獲得指定視窗的狀態及位置訊息
GetWindowRect 獲得整個視窗的範圍矩形,視窗的邊框、標題欄、捲動條及選單等都在這個矩形內
GetWindowText 取得一個窗體的標題(caption)文字,或是一個控件的內容
GetWindowTextLength 調查視窗標題文字或控件內容的長短
GetWindowWord 獲得指定視窗結構的訊息
InflateRect 增大或減小一個矩形的大小
IntersectRect 這個函數在lpDestRect裡載入一個矩形,它是lpSrc1Rect與lpSrc2Rect兩個矩形的交集
InvalidateRect 屏蔽一個視窗客戶區的全部或部分區域
IsChild 判斷一個視窗是否為另一視窗的子或隸屬視窗
IsIconic 判斷視窗是否已最小化
IsRectEmpty 判斷一個矩形是否為空
IsWindow 判斷一個視窗控制碼是否有效
IsWindowEnabled 判斷視窗是否處於活動狀態
IsWindowUnicode 判斷一個視窗是否為Unicode視窗。這意味著視窗為所有基於文字的消息都接收Unicode文字
IsWindowVisible 判斷視窗是否可見
IsZoomed 判斷視窗是否最大化
LockWindowUpdate 鎖定指定視窗,禁止它更新
MapWindowPoints 將一個視窗客戶區坐標的點轉換到另一視窗的客戶區坐標系統
MoveWindow 改變指定視窗的位置和大小
OffsetRect 通過套用一個特殊的偏移,從而讓矩形移動起來
OpenIcon 還原一個最小化的程式,並將其啟用
PtInRect 判斷特殊的點是否位於矩形內定
RedrawWindow 重畫全部或部分視窗
ReleaseCapture 為目前的套用程式釋放滑鼠捕獲
ScreenToClient 判斷螢幕上一個指定點的客戶區坐標
ScrollWindow 捲動視窗客戶區的全部或一部分
ScrollWindowEx 根據附加的選項,捲動視窗客戶區的全部或部分
SetActiveWindow 啟用特殊的視窗
SetCapture 將滑鼠捕獲設定到特殊的視窗
SetClassLong 為視窗類設定一個Long變量條目
SetClassWord 為視窗類設定一個條目
SetFocusAPI 將輸入焦點設到特殊的視窗。如有必要,會啟用視窗
SetForegroundWindow 將視窗設為系統的前台視窗
SetParent 指定一個視窗的新父
SetRect 設定指定矩形的內容
SetRectEmpty 將矩形設為一個空矩形
SetWindowContextHelpId 為特殊的視窗設定幫助場景(上下文)ID
SetWindowLong 在視窗結構中為特殊的視窗設定訊息
SetWindowPlacement 設定視窗狀態和位置訊息
SetWindowPos 為視窗指定一個新位置和狀態
SetWindowText 設定視窗的標題文字或控件的內容
SetWindowWord 在視窗結構中為特殊的視窗設定訊息
ShowOwnedPopups 顯示或隱藏由指定視窗所有的全部跳出式視窗
ShowWindow 控制視窗的可見性
ShowWindowAsync 與ShowWindow相似
SubtractRect 裝載矩形lprcDst,它是在矩形lprcSrc1中減去lprcSrc2得到的結果
TileWindows 以非重疊順序排序視窗
UnionRect 裝載一個lpDestRect目的矩形,它是lpSrc1Rect和lpSrc2Rect聯合起來的結果
UpdateWindow 強制立即更新視窗
ValidateRect 校驗視窗的全部或部分客戶區
WindowFromPoint 返回包括了指定點的視窗的控制碼。忽略屏蔽、隱藏以及透明視窗
2.硬體與系統函數
ActivateKeyboardLayout 啟用一個新的鍵盤佈局。鍵盤佈局定義了按鍵在一種物理性鍵盤上的位置與含義
Beep 用於生成簡單的音效
CharToOem 將一個字串從ANSI字集轉換到OEM字集
ClipCursor 將指標限制到指定區域
ConvertDefaultLocale 將一個特殊的地方標識符轉換成真實的地方ID
CreateCaret 根據特殊的訊息建立一個插入符(游標),並將它選定為指定視窗的預設插入符
DestroyCaret 清除(破壞)一個插入符
EnumCalendarInfo 枚舉在指定「地方」環境中可用的日曆訊息
EnumDateFormats 列舉特殊的「當地」設定中可用的長、短日期格式
EnumSystemCodePages 枚舉系統中已安裝或支援的字碼頁
EnumSystemLocales 枚舉系統已經安裝或提供支援的「地方」設定
EnumTimeFormats 枚舉一個特殊的地方適用的時間格式
ExitWindowsEx 離開windows,並用特定的選項重新啟動
ExpandEnvironmentStrings 擴充環境字串
FreeEnvironmentStrings 翻譯特殊的環境字串塊
GetACP 判斷目前正在生效的ANSI字碼頁
GetAsyncKeyState 判斷函數呼叫時指定虛擬鍵的狀態
GetCaretBlinkTime 判斷插入符游標的閃爍頻率
GetCaretPos 判斷插入符的目前位置
GetClipCursor 取得一個矩形,用於描述目前為滑鼠指標規定的剪下區域
GetCommandLine 獲得指向目前指令行緩沖區的一個指標
GetComputerName 取得這台電腦的名稱
GetCPInfo 取得與指定字碼頁有關的訊息
GetCurrencyFormat 針對特殊的「地方」設定,根據貨幣格式格式化一個數字
GetCursor 取得目前選取的滑鼠指標的控制碼
GetCursorPos 取得滑鼠指標的目前位置
GetDateFormat 針對特殊的「當地」格式,對一個系統日期進行格式化
GetDoubleClickTime 判斷連續兩次滑鼠點選之間會被處理成按兩下事件的間隔時間
GetEnvironmentStrings 為包括了目前環境字串設定的一個記憶體塊分配和返回一個控制碼
GetEnvironmentVariable 取得一個環境變量的值
GetInputState 判斷是否存在任何待決(等待處理)的滑鼠或鍵盤事件
GetKBCodePage 由GetOEMCP取代,兩者功能完全相同
GetKeyboardLayout 取得一個控制碼,描述指定套用程式的鍵盤佈局
GetKeyboardLayoutList 獲得系統適用的所有鍵盤佈局的一個清單
GetKeyboardLayoutName 取得目前活動鍵盤佈局的名稱
GetKeyboardState 取得鍵盤上每個虛擬鍵目前的狀態
GetKeyboardType 瞭解與正在使用的鍵盤有關的訊息
GetKeyNameText 在給出掃瞄碼的前提下,判斷鍵名
GetKeyState 針對已處理過的按鍵,在最近一次輸入訊息時,判斷指定虛擬鍵的狀態
GetLastError 針對之前呼叫的api函數,用這個函數取得延伸錯誤訊息
GetLocaleInfo 取得與指定「地方」有關的訊息
GetLocalTime 取得近端日期和時間
GetNumberFormat 針對特殊的「地方」,按特定的格式格式化一個數字
GetOEMCP 判斷在OEM和ANSI字集間轉換的windows字碼頁
GetQueueStatus 判斷套用程式消息佇列中待決(等待處理)的消息類型
GetSysColor 判斷指定windows顯示對象的彩色
GetSystemDefaultLangID 取得系統的預設語系ID
GetSystemDefaultLCID 取得目前的預設系統「地方」
GetSystemInfo 取得與底層硬體平台有關的訊息
GetSystemMetrics 返回與windows環境有關的訊息
GetSystemPowerStatus 獲得與目前系統電源狀態有關的訊息
GetSystemTime 取得目前系統時間,這個時間採用的是「協同世界時間」(即UTC,也叫做GMT)格式
GetSystemTimeAdjustment 使內定系統時鐘與一個外部的時鐘信號源同步
GetThreadLocale 取得目前執行緒的地方ID
GetTickCount 用於取得自windows啟動以來經歷的時間長度(毫秒)
GetTimeFormat 針對目前特殊的「地方」,按特定的格式格式化一個系統時間
GetTimeZoneInformation 取得與系統時區設定有關的訊息
GetUserDefaultLangID 為目前使用者取得預設語系ID
GetUserDefaultLCID 取得目前使用者的預設「地方」設定
GetUserName 取得目前使用者的名字
GetVersion 判斷目前執行的Windows和DOS版本
GetVersionEx 取得與平台和動作系統有關的版本訊息
HideCaret 在特殊的視窗隱藏插入符(游標)
IsValidCodePage 判斷一個字碼頁是否有效
IsValidLocale 判斷地方標識符是否有效
keybd_event 這個函數類比了鍵盤行動
LoadKeyboardLayout 載入一個鍵盤佈局
MapVirtualKey 根據特殊的映射類型,執行不同的掃瞄碼和字元轉換
MapVirtualKeyEx 根據特殊的映射類型,執行不同的掃瞄碼和字元轉換
MessageBeep 播放一個系統音效。系統音效的分配專案是在控制台裡決定的
mouse_event 類比一次滑鼠事件
OemKeyScan 判斷OEM字集中的一個ASCII字元的掃瞄碼和Shift鍵狀態
OemToChar 將OEM字集的一個字串轉換到ANSI字集
SetCaretBlinkTime 指定插入符(游標)的閃爍頻率
SetCaretPos 指定插入符的位置
SetComputerName 設定新的電腦名
SetCursor 將特殊的滑鼠指標設為目前指標
SetCursorPos 設定指標的位置
SetDoubleClickTime 設定連續兩次滑鼠點選之間能使系統認為是按兩下事件的間隔時間
SetEnvironmentVariable 將一個環境變量設為特殊的值
SetKeyboardState 設定每個虛擬鍵目前在鍵盤上的狀態
SetLocaleInfo 改變使用者「地方」設定訊息
SetLocalTime 設定目前地方時間
SetSysColors 設定指定視窗顯示對象的彩色
SetSystemCursor 改變任何一個標準系統指標
SetSystemTime 設定目前系統時間
SetSystemTimeAdjustment 定時加入一個校準值使內定系統時鐘與一個外部的時鐘信號源同步
SetThreadLocale 為目前執行緒設定地方
SetTimeZoneInformation 設定系統時區訊息
ShowCaret 在特殊的視窗裡顯示插入符(游標)
ShowCursor 控制滑鼠指標的可視性
SwapMouseButton 決定是否互換滑鼠左右鍵的功能
SystemParametersInfo 取得和設定數量眾多的windows系統參數
SystemTimeToTzSpecificLocalTime 將系統時間轉換成地方時間
ToAscii 根據目前的掃瞄碼和鍵盤訊息,將一個虛擬鍵轉換成ASCII字元
ToUnicode 根據目前的掃瞄碼和鍵盤訊息,將一個虛擬鍵轉換成Unicode字元
UnloadKeyboardLayout 卸載特殊的鍵盤佈局
VkKeyScan 針對Windows字集中一個ASCII字元,判斷虛擬鍵碼和Shift鍵的狀態
完
3.選單函數
AppendMenu 在特殊的選單裡加入一個選單項
CheckMenuItem 復選或撤消復選特殊的選單條目
CheckMenuRadioItem 指定一個選單條目被復選成「單選」項目
CreateMenu 建立新選單
CreatePopupMenu 建立一個空的跳出式選單
DeleteMenu 刪除特殊的選單條目
DestroyMenu 刪除特殊的選單
DrawMenuBar 為特殊的視窗重畫選單
EnableMenuItem 容許或禁止特殊的選單條目
GetMenu 取得視窗中一個選單的控制碼
GetMenuCheckMarkDimensions 返回一個選單復選符的大小
GetMenuContextHelpId 取得一個選單的幫助場景ID
GetMenuDefaultItem 判斷選單中的哪個條目是預設條目
GetMenuItemCount 返回選單中條目(選單項)的數量
GetMenuItemID 返回位於選單中指定位置處的條目的選單ID
GetMenuItemInfo 取得(接收)與一個選單條目有關的特定訊息
GetMenuItemRect 在一個矩形中裝載指定選單條目的螢幕坐標訊息
GetMenuState 取得與指定選單條目狀態有關的訊息
GetMenuString 取得指定選單條目的字串
GetSubMenu 取得一個跳出式選單的控制碼,它位於選單中特殊的位置
GetSystemMenu 取得指定視窗的系統選單的控制碼
HiliteMenuItem 控制頂級選單條目的加亮顯示狀態
InsertMenu 在選單的指定位置處插入一個選單條目,並根據需要將其他條目向下移動
InsertMenuItem 插入一個新選單條目
IsMenu 判斷特殊的控制碼是否為一個選單的控制碼
LoadMenu 從特殊的模組或套用程式案例中載入一個選單
LoadMenuIndirect 載入一個選單
MenuItemFromPoint 判斷哪個選單條目包括了螢幕上一個特殊的點
ModifyMenu 改變選單條目
RemoveMenu 刪除特殊的選單條目
SetMenu 設定視窗選單
SetMenuContextHelpId 設定一個選單的幫助場景ID
SetMenuDefaultItem 將一個選單條目設為預設條目
SetMenuItemBitmaps 設定一幅特定點陣圖,令其在特殊的選單條目中使用,代替標準的復選符號(√)
SetMenuItemInfo 為一個選單條目設定特殊的訊息
TrackPopupMenu 在螢幕的任意地方顯示一個跳出式選單
TrackPopupMenuEx 與TrackPopupMenu相似,只是它提供了額外的功能
完
以下是幾個關於選單函數的類型定義
MENUITEMINFO 這個結構包括了選單條目的訊息
TPMPARAMS 這個結構用於TrackPopupMenuEx函數以支援額外的功能
4.繪圖函數
AbortPath 拋棄選入指定裝置場景中的所有路徑。也取消目前正在進行的任何路徑的建立工作
AngleArc 用一個連線弧畫一條線
Arc 畫一個圓弧
BeginPath 啟動一個路徑分支
CancelDC 取消另一個執行緒裡的長時間繪圖動作
Chord 畫一個弦
CloseEnhMetaFile 關閉特殊的增強型圖元檔案裝置場景,並將新增的圖元檔案返回一個控制碼
CloseFigure 描繪到一個路徑時,關閉目前開啟的圖形
CloseMetaFile 關閉特殊的圖元檔案裝置場景,並向新增的圖元檔案返回一個控制碼
CopyEnhMetaFile 製作指定增強型圖元檔案的一個副本(複制)
CopyMetaFile 製作指定(標準)圖元檔案的一個副本
CreateBrushIndirect 在一個LOGBRUSH資料結構的基礎上建立一個刷子
CreateDIBPatternBrush 用一幅與裝置無關的點陣圖建立一個刷子,以便指定刷子型態(圖案)
CreateEnhMetaFile 建立一個增強型的圖元檔案裝置場景
CreateHatchBrush 建立帶有陰影圖案的一個刷子
CreateMetaFile 建立一個圖元檔案裝置場景
CreatePatternBrush 用指定了刷子圖案的一幅點陣圖建立一個刷子
CreatePen 用特殊的型態、寬度和彩色建立一個畫筆
CreatePenIndirect 根據特殊的LOGPEN結構建立一個畫筆
CreateSolidBrush 用純色建立一個刷子
DeleteEnhMetaFile 刪除特殊的增強型圖元檔案
DeleteMetaFile 刪除特殊的圖元檔案
DeleteObject 刪除GDI對象,物件使用的所有系統資源都會被釋放
DrawEdge 用特殊的型態描繪一個矩形的邊框
DrawEscape 換碼(Escape)函數將資料直接發至顯示裝置驅動程式
DrawFocusRect 畫一個焦點矩形
DrawFrameControl 描繪一個標準控件
DrawState 為一幅圖像或繪圖動作套用各式各樣的效果
Ellipse 描繪一個橢圓,由特殊的矩形圍繞
EndPath 停止定義一個路徑
EnumEnhMetaFile 針對一個增強型圖元檔案,列舉其中單獨的圖元檔案記錄
EnumMetaFile 為一個標準的windows圖元檔案枚舉單獨的圖元檔案記錄
EnumObjects 枚舉可隨同指定裝置場景使用的畫筆和刷子
ExtCreatePen 建立一個延伸畫筆(裝飾或幾何)
ExtFloodFill 在特殊的裝置場景裡,用目前選取的刷子填充一個區域
FillPath 關閉路徑中任何開啟的圖形,並用目前刷子填充
FillRect 用特殊的刷子填充一個矩形
FlattenPath 將一個路徑中的所有曲線都轉換成線段
FloodFill 用目前選取的刷子在特殊的裝置場景中填充一個區域
FrameRect 用特殊的刷子圍繞一個矩形畫一個邊框
GdiComment 為特殊的增強型圖元檔案裝置場景加入一條註釋訊息
GdiFlush 執行任何未決的繪圖動作
GdiGetBatchLimit 判斷有多少個GDI繪圖指令位於佇列中
GdiSetBatchLimit 指定有多少個GDI繪圖指令能夠進入佇列
GetArcDirection 畫圓弧的時候,判斷目前採用的繪圖方向
GetBkColor 取得指定裝置場景目前的背景彩色
GetBkMode 針對特殊的裝置場景,取得目前的背景填充模式
GetBrushOrgEx 判斷指定裝置場景中目前選定刷子起點
GetCurrentObject 獲得指定類型的目前選定物件
GetCurrentPositionEx 在特殊的裝置場景中取得目前的畫筆位置
GetEnhMetaFile 取得磁碟檔案中包括的一個增強型圖元檔案的圖元檔案控制碼
GetEnhMetaFileBits 將特殊的增強型圖元檔案複製到一個記憶體緩沖區裡
GetEnhMetaFileDescription 返回對一個增強型圖元檔案的說明
GetEnhMetaFileHeader 取得增強型圖元檔案的圖元檔案頭
GetEnhMetaFilePaletteEntries 取得增強型圖元檔案的全部或部分調色板
GetMetaFile 取得包括在一個磁碟檔案中的圖元檔案的圖元檔案控制碼
GetMetaFileBitsEx 將特殊的圖元檔案複製到一個記憶體緩沖區
GetMiterLimit 取得裝置場景的斜率限制(Miter)設定
GetNearestColor 根據裝置的顯示能力,取得與指定彩色最接近的一種純色
GetObjectAPI 取得對指定物件進行說明的一個結構
GetObjectType 判斷由指定控制碼引用的GDI對象的類型
GetPath 取得對目前路徑進行定義的一系列資料
GetPixel 在特殊的裝置場景中取得一個像素的RGB值
GetPolyFillMode 針對特殊的裝置場景,獲得多邊形填充模式
GetROP2 針對特殊的裝置場景,取得目前的繪圖模式
GetStockObject 取得一個固有對象(Stock)
GetSysColorBrush 為任何一種標準系統彩色取得一個刷子
GetWinMetaFileBits 通過在一個緩沖區中填充用於標準圖元檔案的資料,將一個增強型圖元檔案轉換成標準windows圖元檔案
InvertRect 通過反轉每個像素的值,從而反轉一個裝置場景中特殊的矩形
LineDDA 枚舉指定線段中的所有點
LineTo 用目前畫筆畫一條線,從目前位置連到一個特殊的點
原文連結:
http://ck101.com/forums/viewthread.php?tid=1267712&extra=page%3D1%26amp%3Bfilter%3Dtype%26amp%3Btypeid%3D29
VB寫程式基礎課
什麼是API API文字遊覽器
API函數聲明 資料類型與"類型安全"
常 數 結 構
小 結 一些API函數集: 控件與消息函數、硬體與系統函數、選單函數、繪圖函數
什麼是API
首先,有必要向大家講一講,什麼是API。所謂API本來是為C和C++程式員寫的。API說來說去,就是一種函數,他們包括在一個附加名為DLL的動態連線庫檔案中。用標準的定義來講,API就是Windows的32位套用程式寫程式接口,是一系列很複雜的函數,消息和結構,它使寫程式人員可以用不同類型的寫程式語系編製出的執行在Windows95和Windows NT動作系統上的套用程式。可以說,若果你曾經學過VC,那麼API對你來說不是什麼問題。但是若果你沒有學過VC,或是你對Windows95的結構體系不熟悉,那麼可以說,學習API將是一件很辛苦的事情。
若果你開啟WINDOWS的SYSTEM資料夾,你可以發現其中有很多附加名為DLL的檔案。一個DLL中包括的API函數並不只是一個,數十個,甚至是數百個。我們能都掌握它嘛?回答是否定的︰不可能掌握。但實際上,我們真的沒必要都掌握,只要重點掌握Windos系統本身自帶的API函數就可以了。但,在其中還應當拋開掉同VB本身自有的函數重複的函數。如,VB
的etAttr指令可以獲得檔案屬性,SetAttr可以設定檔案屬性。對API來講也有對應的函數
GetFileAttributes和SetFileAttributes,效能都差不多。如此地一算,剩下來的也就5、600個。是的,也不少。但,我可以敢跟你說,只要你熟悉地掌握100個,那麼你的寫程式水平比現在高出至少要兩倍。儘管人們說VB和WINDOWS具有密切的關係,但我認為,API更接近
WINDOWS。若果你學會了API,首要的收穫便是對WINDOWS體系結構的認識。這個收穫是來自不易的。
若果你不依靠API會怎麼樣?我可以跟你說,絕大多是進階寫程式書本(當然這不是書的名程叫進階而進階的,而是在一開始的《本書內容》中指明《本書的閱讀對象是具有一定VB基礎的讀者》的那些書),首先提的問題一般大都是從API開始。因此可以說,你不學API,你大概將停留在初級水平,無法往上攀登。唯一的途徑也許就是向別人求救︰我快死了,快來救救我呀,這個怎麼辦,那個怎麼辦?煩不煩呢?當然,現在網上好人太多(內含我在內,嘻嘻),但,你應當明白,通過此途徑,你的手中出不了好的作品。這是因為缺乏這些知識你的腦子裡根本行不成一種總體的設計構思。
API文字遊覽器 [返回]
很多API函數都是很長很長的。想看什麼樣子嗎?如下就是作為例子的API DdeClientTransaction函數︰
Declare Function DdeClientTransaction Lib "user32" (pData As Byte, ByVal cbData As Long, ByVal hConv As Long, ByVal hszItem As Long, ByVal wFmt As Long, ByVal wType As Long, ByVal dwTimeout As Long, pdwResult As Long) As Long
哇!這麼長?若果你從來沒有接觸過API,我想你肯定被嚇住了。你也許考慮,該不該繼續學下去。不過不要擔心,幸運的是Microsoft的設計家們為我們提供了有用的工具,這便是API
文字檢視器。
通過API文字檢視器,我們可以方便地尋找程式所需要的函數聲明、結構類型和常量,然後將它複製到剪貼簿,最後再貼上到VB程式的代碼段中。在大多數情況下,只要我們確定了程式所需要的函數、結構和常量這三個方面後,就可以通過對API文字遊覽器的以上動作將他們加入到程式段中,從而程式中可以使用這些函數了。這些是學習API最基本的常識問題,它遠遠佔不到API的龐大的體系內容。今後我們把精力浪費(這絕不是浪費)在哪裡呢?那就是︰
什麼時候使用什麼函數,什麼時候使用什麼結構類型,什麼時候使用什麼常量。
API函數聲明
讓我們回想一下。在VB中,如何聲明函數呢?我想,若果你正在看此文,那麼你絕對能夠回答得出這個問題。以下便是你應該很熟悉的函數聲明︰
Function SetFocus (ByVal hwnd As Long) As Long
即,這行代碼定義了名為SetFocus的函數,此函數具有一個Long型資料類型的參數,並按值傳遞(ByVal),函數執行後將返回一個Long型資料。
API函數的聲明也很類似,如,API中的SetFocus 函數是這樣寫的︰
Declare Function SetFocus Lib "user32" Alias "SetFocus" (ByVal hwnd As Long) As Long
有點複雜了一些。是的,是複雜了點。但我可以告訴你,除了這些多出來的部分,其他部分還是和你以前學到的東西是一樣的。函數在程式中的呼叫也是一樣。如:
Dim dl As Long
dl&=SetFoucs(Form1.Hwnd)
但,一點是清楚的。它不像你自己寫的程式那樣能夠看到裡面的執行機理,也不像VB
自帶的函數那樣,能夠從VB的聯機幫助中查到其用法。唯一的方法就是去學、查VB以外的資料。
Declare 語句用於在模組層級中聲明對動態連結庫 (DLL) 中外部過程的引用。對此,你只要記住任何API函數聲明都必須寫這個語句就可以了。
Iib 指明包括所聲明過程或函數的動態連結庫或代碼資源。也就是說,它說明的是,函數或過程從何而來的問題。
如在上例中,SetFocus Lib "user32"說明 函數 SetFocus 來自 user32.dll檔案。主要的dll動態連線庫檔案有︰
user32.dll Windows管理。生成和管理套用程式的使用者接口。
GDI32.dll 圖形裝置接口。產生Windows裝置的圖形輸出
Kernel32.dll 系統服務。訪問動作系統的電腦資源。
注意,當DLL檔案不在Windows或System資料夾中的時候,必須在函數中說明其出處(
路徑)。如,SetFocus Lib "c:\Mydll\user32"
函數聲明中的Alias 是可選的。表示將被呼叫的過程在動態連結庫 (DLL) 中還有另外的名稱(別名)。如,Alias "SetFocus" ,說明SetFocus函數在User32.dll中的另外一個名稱是,
SetFocus。怎麼兩個名都一樣呢?當然,也可以是不同的。在很多情況下,Alias說明的函數名,即別名最後一個字元經常是字元A,如SetWindowsText函數的另一個名稱是
SetWindowsTextA,表示為Alias "SetWindowsTextA"。這個A只不過是設計家們的習慣的命名約定,表示函數屬於ANSI版本。
那麼,別名究竟有什麼用途呢?從理論上講,別名提供了用另一個名子呼叫API的函數方法。若果你指明了別名,那麼儘管我們按Declare語句後面的函數來呼叫該函數,但在函數的實際呼叫上是以別名作為首要選取的。如,以下兩個函數(Function,ABCD)聲明都是有效的,他們呼叫的是同一個 SetFocus函數︰
Declare Function SetFocus Lib "user32" "SetFocus" (ByVal hwnd As Long) As Long
Declare ABCD SetFocus Lib "user32" Alias "SetFocus" (ByVal hwnd As Long) As Long
需要注意的是,選用Alias的時候,應注意別名的大小寫;若果不選用Alias 時的時候,函數名必須注意大小寫,而且不能改動。當然,在很多情況下,由於函數聲明是直接從API
文字遊覽器中複制過來的,所以這種錯誤的發生機會是很少的,但您有必要知道這一點。
最後提醒你一句,API聲明(內含結構、常量)必須放在窗體或模組的"通用(General Declarations)段。
資料類型與"類型安全"
API函數中使用的資料類型基本上和VB中的一樣。但作為WIN32的API函數中,不存在Integer
資料類型。另外一點是在API函數中看不到Boolean資料類型。 Variant資料類型在API函數中是以Any的形式出現,如Data As Any。儘管其含義是容許任意參數類型作為一個該API函數的參數傳遞,但這樣做存在一定的缺點。其原因是,這將會使得對目的參數的所有類型檢查都會被關閉。這自然會給各種類型的參數呼叫帶來了產生錯誤的機會。
為了強制執行嚴格的類型檢查,並避免上面提到的問題,一個辦法是在函數里使用上面提到到Alias技術。如對API函數 GetDIBits 可進行另外一種聲明方法。如下︰
GetDIBits函數的原型︰
Public Declare Function GetDIBits Lib "gdi32" Alias "GetDIBits" (ByVal aHDC As Long, ByVal hBitmap As Long, ByVal nStartScan As Long, ByVal nNumScans As Long, lpBits As Any, lpBI As BITMAPINFO, ByVal wUsage As Long) As Long
GetDIBits函數的改型︰
Public Declare Function GetDIBitsLong Lib "gdi32" Alias "GetDIBits" (ByVal aHDC As Long, ByVal hBitmap As Long, ByVal nStartScan As Long, ByVal nNumScans As Long, lpBits As Long, lpBI As BITMAPINFO, ByVal wUsage As Long) As Long
通過本課程前面所學到的知識,我們已經可以得知原型 GetDIBits函數也好,改型 GetDIBitsLong函數也好,實際將呼叫的都是Alias所特殊的 GetDIBits原函數。但你應當看到,兩者的區別在於,我們在改型的函數中強制指定lpBits參數為Long形。這樣就會使得函數呼叫中發生的錯誤機率減少到了最小。這種方法叫做"安全類型"聲明。
API函數中經常看到的資料類型有︰Long,String,Byte,Any....(也就這些吧。)
常 數
對於API常量來講,沒有什麼太特別的學問。請看VB中的以下代碼︰
Msg = MsgBox("您好", vbOKCancel)
我們知道, vbOKCancel這個常量的值等於1。對上面的代碼我們完全可以這樣寫,而不會影響代碼的功能︰
Msg = MsgBox("您好", 1)
但你大概不太願意選取後一種,因為這會使得看懂代碼費勁起來。這種方法也被API採取了。只是API常量必須在事情之前做好起始化聲明VB本身是看不懂的。其內容仍然來自與API
文字遊覽器。具體形式如下等等︰
Public Const ABM_ACTIVATE = &H6
Public Const RIGHT_CTRL_PRESSED = &H4
Public Const RPC_E_SERVER_DIED = &H80010007
Private Const RPC_S_CALL_FAILED_DNE = 1727&
在常量的起始化中,有些程式使用Global,如Global Const ABM_ACTIVATE = &H6,但我認為Public完全可以代替它。過去我也用過Global,但現在不大用了。一會兒用這個,一會兒用那個,各程式之間不能保持一致性了,起碼看起來彆扭。
結 構 [返回]
結構是C和C++語系中的說法。在VB中一般稱為自訂資料類型。想必很多朋友都已經認識它。在API領域裡,我更喜歡把它叫做結構,因為API各種結構類型根本不是我定義(
自訂)的。
在VB中,API結構同樣由TYPE.......END TYPE語句來定義。如,在API中,點(Point)結構的定義方法如下:
Public Type POINTAPI
X As Long '點在X坐標(橫坐標)上的坐標值
Y As Long '點在Y坐標(縱坐標)上的坐標值
End Type
又如,API中矩形(Rect)結構的定義如下︰
Public Type RECT
Left As Long '矩形左上角的X坐標
Top As Long '矩形左上角的Y坐標
Right As Long '矩形右下角的X坐標
Bottom As Long '矩形右下角的Y坐標
End Type
這些內容同樣可以從API文字遊覽器中複制過來。這些結構中的變量名可隨意改動,而不會影響結構本身。也就是說,這些成員變量都是虛擬的。如,POINTAPI結構可改為如下︰
Public Type POINTAPI
MyX As Long '點在X坐標(橫坐標)上的坐標值
MyY As Long '點在Y坐標(縱坐標)上的坐標值
End Type
不過,一般來講,是沒有這種必要的。結構本身是一種資料類型,因此,使用時必須聲明具體變量為該結構型,才能在程式中真正使用到該結構。結構的聲明方法和其他資料的聲明方法一樣,如,以下語句把變MyPoint聲明為POINTAPI結構類型︰
MyPoint As POINTAPI
引用結構中的成員變量也十分簡單,在結構名後面加上一個".",然後緊接著寫要引用的成員變量即可。這很像VB中的引用一個對象的某個屬性。如,假如我們把上面已經聲明的MyPoint結構中的X變量的值賦給變量Temp&
則代碼如下︰
Temp&=MyPoint.X
但,特別注意的是,你千萬不要認為上例中的MyPoint是一個值。它不是值,而是位址(
指標)。值和位址是完全不同的概念。結構要求按引用傳遞給WINDOWS函數,即所有API
函數中,結構都是按ByRef傳遞的(在Declare語句中ByRef是預設型)。對於結構的傳遞,你不要試圖採用ByVal,你將一無所獲。由於結構名實際上就是指向這個結構的指標(這個結構的首位址),所以,你也就傳輸特定的結構名就可以了(參見小結,我用紅色字型來突出了這種傳遞模式)。
由於結構傳輸的是指標,所以函數將直接對結構進行讀寫動作。這種特性很適合於把函數執行的結果裝載在結構之中。
小 結 [返回]
以下的程式是為了總結本課國中到的內容而給出的。啟動VB,新增一個項目,加入一個指令按鈕,並把下面的代碼複制到代碼段中,執行它。
Private Declare Function GetCursorPos Lib "user32" (lpPoint As POINTAPI) As Long
Private Type POINTAPI '定義點(Point)結構
X As Long '點在X坐標(橫坐標)上的坐標值
Y As Long '點在Y坐標(縱坐標)上的坐標值
End Type
Sub PrintCursorPos( )
Dim dl AS Long
Dim MyPoint As POINTAPI
dl&= GetCursorPos(MyPoint) '呼叫函數,取得螢幕滑鼠坐標
Debug.Print "X=" & Str(MyPoint.X) & " and " & "Y=" & Str(MyPoint.Y)
End Sub
Private Sub Command1_Click()
PrintCursorPos
End Sub
輸出結果為(每次執行都可能得到不同的結果,這得由函數呼叫時滑鼠指標在螢幕中所處的位置而決定)︰
X= 240 and Y= 151
程式中,GetCursorPos函數用來取得滑鼠指標在螢幕上的位置。
以上例子中,你可以發現,以參數傳遞的MyPpint結構的內容在函數呼叫後發生了實質性變化。這是由於結構是按ByRef傳遞的原因。
一些API函數集 [返回]
Windows API
1.控件與消息函數
AdjustWindowRect 給定一種視窗型態,計算獲得目的客戶區矩形所需的視窗大小
AnyPopup 判斷螢幕上是否存在任何跳出式視窗
ArrangeIconicWindows 排序一個父視窗的最小化子視窗
AttachThreadInput 連線執行緒輸入函數
BeginDeferWindowPos 啟動構建一系列新視窗位置的過程
BringWindowToTop 將特殊的視窗帶至視窗清單頂部
CascadeWindows 以層疊模式排序視窗
ChildWindowFromPoint 返回父視窗中包括了指定點的第一個子視窗的控制碼
ClientToScreen 判斷視窗內以客戶區坐標表示的一個點的螢幕坐標
CloseWindow 最小化特殊的視窗
CopyRect 矩形內容複製
DeferWindowPos 該函數為特定的視窗指定一個新視窗位置
DestroyWindow 清除特殊的視窗以及它的所有子視窗
DrawAnimatedRects 描繪一系列動態矩形
EnableWindow 特殊的視窗裡容許或禁止所有滑鼠及鍵盤輸入
EndDeferWindowPos 同時更新DeferWindowPos呼叫時特殊的所有視窗的位置及狀態
EnumChildWindows 為特殊的父視窗枚舉子視窗
EnumThreadWindows 枚舉與指定任務關聯的視窗
EnumWindows 枚舉視窗清單中的所有父視窗
EqualRect 判斷兩個矩形結構是否相同
FindWindow 尋找視窗清單中第一個符合指定條件的頂級視窗
FindWindowEx 在視窗清單中尋找與指定條件相符的第一個子視窗
FlashWindow 閃爍顯示指定視窗
GetActiveWindow 獲得活動視窗的控制碼
GetCapture 獲得一個視窗的控制碼,這個視窗位於目前輸入執行緒,且擁有滑鼠捕獲(滑鼠活動由它接收)
GetClassInfo 取得WNDCLASS結構(或WNDCLASSEX結構)的一個副本,結構中包括了與指定類有關的訊息
GetClassLong 取得視窗類的一個Long變量條目
GetClassName 為特殊的視窗取得類名
GetClassWord 為視窗類取得一個整數變量
GetClientRect 返回指定視窗客戶區矩形的大小
GetDesktopWindow 獲得代表整個螢幕的一個視窗(桌面視窗)控制碼
GetFocus 獲得擁有輸入焦點的視窗的控制碼
GetForegroundWindow 獲得前台視窗的控制碼
GetLastActivePopup 獲得在一個給定父視窗中最近啟用過的跳出式視窗的控制碼
GetLastError 針對之前呼叫的api函數,用這個函數取得延伸錯誤訊息
GetParent 判斷指定視窗的父視窗
GetTopWindow 搜尋內定視窗清單,尋找隸屬於指定視窗的頭一個視窗的控制碼
GetUpdateRect 獲得一個矩形,它描敘了指定視窗中需要更新的那一部分
GetWindow 獲得一個視窗的控制碼,該視窗與某源視窗有特定的關係
GetWindowContextHelpId 取得與視窗關聯在一起的幫助場景ID
GetWindowLong 從指定視窗的結構中取得訊息
GetWindowPlacement 獲得指定視窗的狀態及位置訊息
GetWindowRect 獲得整個視窗的範圍矩形,視窗的邊框、標題欄、捲動條及選單等都在這個矩形內
GetWindowText 取得一個窗體的標題(caption)文字,或是一個控件的內容
GetWindowTextLength 調查視窗標題文字或控件內容的長短
GetWindowWord 獲得指定視窗結構的訊息
InflateRect 增大或減小一個矩形的大小
IntersectRect 這個函數在lpDestRect裡載入一個矩形,它是lpSrc1Rect與lpSrc2Rect兩個矩形的交集
InvalidateRect 屏蔽一個視窗客戶區的全部或部分區域
IsChild 判斷一個視窗是否為另一視窗的子或隸屬視窗
IsIconic 判斷視窗是否已最小化
IsRectEmpty 判斷一個矩形是否為空
IsWindow 判斷一個視窗控制碼是否有效
IsWindowEnabled 判斷視窗是否處於活動狀態
IsWindowUnicode 判斷一個視窗是否為Unicode視窗。這意味著視窗為所有基於文字的消息都接收Unicode文字
IsWindowVisible 判斷視窗是否可見
IsZoomed 判斷視窗是否最大化
LockWindowUpdate 鎖定指定視窗,禁止它更新
MapWindowPoints 將一個視窗客戶區坐標的點轉換到另一視窗的客戶區坐標系統
MoveWindow 改變指定視窗的位置和大小
OffsetRect 通過套用一個特殊的偏移,從而讓矩形移動起來
OpenIcon 還原一個最小化的程式,並將其啟用
PtInRect 判斷特殊的點是否位於矩形內定
RedrawWindow 重畫全部或部分視窗
ReleaseCapture 為目前的套用程式釋放滑鼠捕獲
ScreenToClient 判斷螢幕上一個指定點的客戶區坐標
ScrollWindow 捲動視窗客戶區的全部或一部分
ScrollWindowEx 根據附加的選項,捲動視窗客戶區的全部或部分
SetActiveWindow 啟用特殊的視窗
SetCapture 將滑鼠捕獲設定到特殊的視窗
SetClassLong 為視窗類設定一個Long變量條目
SetClassWord 為視窗類設定一個條目
SetFocusAPI 將輸入焦點設到特殊的視窗。如有必要,會啟用視窗
SetForegroundWindow 將視窗設為系統的前台視窗
SetParent 指定一個視窗的新父
SetRect 設定指定矩形的內容
SetRectEmpty 將矩形設為一個空矩形
SetWindowContextHelpId 為特殊的視窗設定幫助場景(上下文)ID
SetWindowLong 在視窗結構中為特殊的視窗設定訊息
SetWindowPlacement 設定視窗狀態和位置訊息
SetWindowPos 為視窗指定一個新位置和狀態
SetWindowText 設定視窗的標題文字或控件的內容
SetWindowWord 在視窗結構中為特殊的視窗設定訊息
ShowOwnedPopups 顯示或隱藏由指定視窗所有的全部跳出式視窗
ShowWindow 控制視窗的可見性
ShowWindowAsync 與ShowWindow相似
SubtractRect 裝載矩形lprcDst,它是在矩形lprcSrc1中減去lprcSrc2得到的結果
TileWindows 以非重疊順序排序視窗
UnionRect 裝載一個lpDestRect目的矩形,它是lpSrc1Rect和lpSrc2Rect聯合起來的結果
UpdateWindow 強制立即更新視窗
ValidateRect 校驗視窗的全部或部分客戶區
WindowFromPoint 返回包括了指定點的視窗的控制碼。忽略屏蔽、隱藏以及透明視窗
2.硬體與系統函數
ActivateKeyboardLayout 啟用一個新的鍵盤佈局。鍵盤佈局定義了按鍵在一種物理性鍵盤上的位置與含義
Beep 用於生成簡單的音效
CharToOem 將一個字串從ANSI字集轉換到OEM字集
ClipCursor 將指標限制到指定區域
ConvertDefaultLocale 將一個特殊的地方標識符轉換成真實的地方ID
CreateCaret 根據特殊的訊息建立一個插入符(游標),並將它選定為指定視窗的預設插入符
DestroyCaret 清除(破壞)一個插入符
EnumCalendarInfo 枚舉在指定「地方」環境中可用的日曆訊息
EnumDateFormats 列舉特殊的「當地」設定中可用的長、短日期格式
EnumSystemCodePages 枚舉系統中已安裝或支援的字碼頁
EnumSystemLocales 枚舉系統已經安裝或提供支援的「地方」設定
EnumTimeFormats 枚舉一個特殊的地方適用的時間格式
ExitWindowsEx 離開windows,並用特定的選項重新啟動
ExpandEnvironmentStrings 擴充環境字串
FreeEnvironmentStrings 翻譯特殊的環境字串塊
GetACP 判斷目前正在生效的ANSI字碼頁
GetAsyncKeyState 判斷函數呼叫時指定虛擬鍵的狀態
GetCaretBlinkTime 判斷插入符游標的閃爍頻率
GetCaretPos 判斷插入符的目前位置
GetClipCursor 取得一個矩形,用於描述目前為滑鼠指標規定的剪下區域
GetCommandLine 獲得指向目前指令行緩沖區的一個指標
GetComputerName 取得這台電腦的名稱
GetCPInfo 取得與指定字碼頁有關的訊息
GetCurrencyFormat 針對特殊的「地方」設定,根據貨幣格式格式化一個數字
GetCursor 取得目前選取的滑鼠指標的控制碼
GetCursorPos 取得滑鼠指標的目前位置
GetDateFormat 針對特殊的「當地」格式,對一個系統日期進行格式化
GetDoubleClickTime 判斷連續兩次滑鼠點選之間會被處理成按兩下事件的間隔時間
GetEnvironmentStrings 為包括了目前環境字串設定的一個記憶體塊分配和返回一個控制碼
GetEnvironmentVariable 取得一個環境變量的值
GetInputState 判斷是否存在任何待決(等待處理)的滑鼠或鍵盤事件
GetKBCodePage 由GetOEMCP取代,兩者功能完全相同
GetKeyboardLayout 取得一個控制碼,描述指定套用程式的鍵盤佈局
GetKeyboardLayoutList 獲得系統適用的所有鍵盤佈局的一個清單
GetKeyboardLayoutName 取得目前活動鍵盤佈局的名稱
GetKeyboardState 取得鍵盤上每個虛擬鍵目前的狀態
GetKeyboardType 瞭解與正在使用的鍵盤有關的訊息
GetKeyNameText 在給出掃瞄碼的前提下,判斷鍵名
GetKeyState 針對已處理過的按鍵,在最近一次輸入訊息時,判斷指定虛擬鍵的狀態
GetLastError 針對之前呼叫的api函數,用這個函數取得延伸錯誤訊息
GetLocaleInfo 取得與指定「地方」有關的訊息
GetLocalTime 取得近端日期和時間
GetNumberFormat 針對特殊的「地方」,按特定的格式格式化一個數字
GetOEMCP 判斷在OEM和ANSI字集間轉換的windows字碼頁
GetQueueStatus 判斷套用程式消息佇列中待決(等待處理)的消息類型
GetSysColor 判斷指定windows顯示對象的彩色
GetSystemDefaultLangID 取得系統的預設語系ID
GetSystemDefaultLCID 取得目前的預設系統「地方」
GetSystemInfo 取得與底層硬體平台有關的訊息
GetSystemMetrics 返回與windows環境有關的訊息
GetSystemPowerStatus 獲得與目前系統電源狀態有關的訊息
GetSystemTime 取得目前系統時間,這個時間採用的是「協同世界時間」(即UTC,也叫做GMT)格式
GetSystemTimeAdjustment 使內定系統時鐘與一個外部的時鐘信號源同步
GetThreadLocale 取得目前執行緒的地方ID
GetTickCount 用於取得自windows啟動以來經歷的時間長度(毫秒)
GetTimeFormat 針對目前特殊的「地方」,按特定的格式格式化一個系統時間
GetTimeZoneInformation 取得與系統時區設定有關的訊息
GetUserDefaultLangID 為目前使用者取得預設語系ID
GetUserDefaultLCID 取得目前使用者的預設「地方」設定
GetUserName 取得目前使用者的名字
GetVersion 判斷目前執行的Windows和DOS版本
GetVersionEx 取得與平台和動作系統有關的版本訊息
HideCaret 在特殊的視窗隱藏插入符(游標)
IsValidCodePage 判斷一個字碼頁是否有效
IsValidLocale 判斷地方標識符是否有效
keybd_event 這個函數類比了鍵盤行動
LoadKeyboardLayout 載入一個鍵盤佈局
MapVirtualKey 根據特殊的映射類型,執行不同的掃瞄碼和字元轉換
MapVirtualKeyEx 根據特殊的映射類型,執行不同的掃瞄碼和字元轉換
MessageBeep 播放一個系統音效。系統音效的分配專案是在控制台裡決定的
mouse_event 類比一次滑鼠事件
OemKeyScan 判斷OEM字集中的一個ASCII字元的掃瞄碼和Shift鍵狀態
OemToChar 將OEM字集的一個字串轉換到ANSI字集
SetCaretBlinkTime 指定插入符(游標)的閃爍頻率
SetCaretPos 指定插入符的位置
SetComputerName 設定新的電腦名
SetCursor 將特殊的滑鼠指標設為目前指標
SetCursorPos 設定指標的位置
SetDoubleClickTime 設定連續兩次滑鼠點選之間能使系統認為是按兩下事件的間隔時間
SetEnvironmentVariable 將一個環境變量設為特殊的值
SetKeyboardState 設定每個虛擬鍵目前在鍵盤上的狀態
SetLocaleInfo 改變使用者「地方」設定訊息
SetLocalTime 設定目前地方時間
SetSysColors 設定指定視窗顯示對象的彩色
SetSystemCursor 改變任何一個標準系統指標
SetSystemTime 設定目前系統時間
SetSystemTimeAdjustment 定時加入一個校準值使內定系統時鐘與一個外部的時鐘信號源同步
SetThreadLocale 為目前執行緒設定地方
SetTimeZoneInformation 設定系統時區訊息
ShowCaret 在特殊的視窗裡顯示插入符(游標)
ShowCursor 控制滑鼠指標的可視性
SwapMouseButton 決定是否互換滑鼠左右鍵的功能
SystemParametersInfo 取得和設定數量眾多的windows系統參數
SystemTimeToTzSpecificLocalTime 將系統時間轉換成地方時間
ToAscii 根據目前的掃瞄碼和鍵盤訊息,將一個虛擬鍵轉換成ASCII字元
ToUnicode 根據目前的掃瞄碼和鍵盤訊息,將一個虛擬鍵轉換成Unicode字元
UnloadKeyboardLayout 卸載特殊的鍵盤佈局
VkKeyScan 針對Windows字集中一個ASCII字元,判斷虛擬鍵碼和Shift鍵的狀態
完
3.選單函數
AppendMenu 在特殊的選單裡加入一個選單項
CheckMenuItem 復選或撤消復選特殊的選單條目
CheckMenuRadioItem 指定一個選單條目被復選成「單選」項目
CreateMenu 建立新選單
CreatePopupMenu 建立一個空的跳出式選單
DeleteMenu 刪除特殊的選單條目
DestroyMenu 刪除特殊的選單
DrawMenuBar 為特殊的視窗重畫選單
EnableMenuItem 容許或禁止特殊的選單條目
GetMenu 取得視窗中一個選單的控制碼
GetMenuCheckMarkDimensions 返回一個選單復選符的大小
GetMenuContextHelpId 取得一個選單的幫助場景ID
GetMenuDefaultItem 判斷選單中的哪個條目是預設條目
GetMenuItemCount 返回選單中條目(選單項)的數量
GetMenuItemID 返回位於選單中指定位置處的條目的選單ID
GetMenuItemInfo 取得(接收)與一個選單條目有關的特定訊息
GetMenuItemRect 在一個矩形中裝載指定選單條目的螢幕坐標訊息
GetMenuState 取得與指定選單條目狀態有關的訊息
GetMenuString 取得指定選單條目的字串
GetSubMenu 取得一個跳出式選單的控制碼,它位於選單中特殊的位置
GetSystemMenu 取得指定視窗的系統選單的控制碼
HiliteMenuItem 控制頂級選單條目的加亮顯示狀態
InsertMenu 在選單的指定位置處插入一個選單條目,並根據需要將其他條目向下移動
InsertMenuItem 插入一個新選單條目
IsMenu 判斷特殊的控制碼是否為一個選單的控制碼
LoadMenu 從特殊的模組或套用程式案例中載入一個選單
LoadMenuIndirect 載入一個選單
MenuItemFromPoint 判斷哪個選單條目包括了螢幕上一個特殊的點
ModifyMenu 改變選單條目
RemoveMenu 刪除特殊的選單條目
SetMenu 設定視窗選單
SetMenuContextHelpId 設定一個選單的幫助場景ID
SetMenuDefaultItem 將一個選單條目設為預設條目
SetMenuItemBitmaps 設定一幅特定點陣圖,令其在特殊的選單條目中使用,代替標準的復選符號(√)
SetMenuItemInfo 為一個選單條目設定特殊的訊息
TrackPopupMenu 在螢幕的任意地方顯示一個跳出式選單
TrackPopupMenuEx 與TrackPopupMenu相似,只是它提供了額外的功能
完
以下是幾個關於選單函數的類型定義
MENUITEMINFO 這個結構包括了選單條目的訊息
TPMPARAMS 這個結構用於TrackPopupMenuEx函數以支援額外的功能
4.繪圖函數
AbortPath 拋棄選入指定裝置場景中的所有路徑。也取消目前正在進行的任何路徑的建立工作
AngleArc 用一個連線弧畫一條線
Arc 畫一個圓弧
BeginPath 啟動一個路徑分支
CancelDC 取消另一個執行緒裡的長時間繪圖動作
Chord 畫一個弦
CloseEnhMetaFile 關閉特殊的增強型圖元檔案裝置場景,並將新增的圖元檔案返回一個控制碼
CloseFigure 描繪到一個路徑時,關閉目前開啟的圖形
CloseMetaFile 關閉特殊的圖元檔案裝置場景,並向新增的圖元檔案返回一個控制碼
CopyEnhMetaFile 製作指定增強型圖元檔案的一個副本(複制)
CopyMetaFile 製作指定(標準)圖元檔案的一個副本
CreateBrushIndirect 在一個LOGBRUSH資料結構的基礎上建立一個刷子
CreateDIBPatternBrush 用一幅與裝置無關的點陣圖建立一個刷子,以便指定刷子型態(圖案)
CreateEnhMetaFile 建立一個增強型的圖元檔案裝置場景
CreateHatchBrush 建立帶有陰影圖案的一個刷子
CreateMetaFile 建立一個圖元檔案裝置場景
CreatePatternBrush 用指定了刷子圖案的一幅點陣圖建立一個刷子
CreatePen 用特殊的型態、寬度和彩色建立一個畫筆
CreatePenIndirect 根據特殊的LOGPEN結構建立一個畫筆
CreateSolidBrush 用純色建立一個刷子
DeleteEnhMetaFile 刪除特殊的增強型圖元檔案
DeleteMetaFile 刪除特殊的圖元檔案
DeleteObject 刪除GDI對象,物件使用的所有系統資源都會被釋放
DrawEdge 用特殊的型態描繪一個矩形的邊框
DrawEscape 換碼(Escape)函數將資料直接發至顯示裝置驅動程式
DrawFocusRect 畫一個焦點矩形
DrawFrameControl 描繪一個標準控件
DrawState 為一幅圖像或繪圖動作套用各式各樣的效果
Ellipse 描繪一個橢圓,由特殊的矩形圍繞
EndPath 停止定義一個路徑
EnumEnhMetaFile 針對一個增強型圖元檔案,列舉其中單獨的圖元檔案記錄
EnumMetaFile 為一個標準的windows圖元檔案枚舉單獨的圖元檔案記錄
EnumObjects 枚舉可隨同指定裝置場景使用的畫筆和刷子
ExtCreatePen 建立一個延伸畫筆(裝飾或幾何)
ExtFloodFill 在特殊的裝置場景裡,用目前選取的刷子填充一個區域
FillPath 關閉路徑中任何開啟的圖形,並用目前刷子填充
FillRect 用特殊的刷子填充一個矩形
FlattenPath 將一個路徑中的所有曲線都轉換成線段
FloodFill 用目前選取的刷子在特殊的裝置場景中填充一個區域
FrameRect 用特殊的刷子圍繞一個矩形畫一個邊框
GdiComment 為特殊的增強型圖元檔案裝置場景加入一條註釋訊息
GdiFlush 執行任何未決的繪圖動作
GdiGetBatchLimit 判斷有多少個GDI繪圖指令位於佇列中
GdiSetBatchLimit 指定有多少個GDI繪圖指令能夠進入佇列
GetArcDirection 畫圓弧的時候,判斷目前採用的繪圖方向
GetBkColor 取得指定裝置場景目前的背景彩色
GetBkMode 針對特殊的裝置場景,取得目前的背景填充模式
GetBrushOrgEx 判斷指定裝置場景中目前選定刷子起點
GetCurrentObject 獲得指定類型的目前選定物件
GetCurrentPositionEx 在特殊的裝置場景中取得目前的畫筆位置
GetEnhMetaFile 取得磁碟檔案中包括的一個增強型圖元檔案的圖元檔案控制碼
GetEnhMetaFileBits 將特殊的增強型圖元檔案複製到一個記憶體緩沖區裡
GetEnhMetaFileDescription 返回對一個增強型圖元檔案的說明
GetEnhMetaFileHeader 取得增強型圖元檔案的圖元檔案頭
GetEnhMetaFilePaletteEntries 取得增強型圖元檔案的全部或部分調色板
GetMetaFile 取得包括在一個磁碟檔案中的圖元檔案的圖元檔案控制碼
GetMetaFileBitsEx 將特殊的圖元檔案複製到一個記憶體緩沖區
GetMiterLimit 取得裝置場景的斜率限制(Miter)設定
GetNearestColor 根據裝置的顯示能力,取得與指定彩色最接近的一種純色
GetObjectAPI 取得對指定物件進行說明的一個結構
GetObjectType 判斷由指定控制碼引用的GDI對象的類型
GetPath 取得對目前路徑進行定義的一系列資料
GetPixel 在特殊的裝置場景中取得一個像素的RGB值
GetPolyFillMode 針對特殊的裝置場景,獲得多邊形填充模式
GetROP2 針對特殊的裝置場景,取得目前的繪圖模式
GetStockObject 取得一個固有對象(Stock)
GetSysColorBrush 為任何一種標準系統彩色取得一個刷子
GetWinMetaFileBits 通過在一個緩沖區中填充用於標準圖元檔案的資料,將一個增強型圖元檔案轉換成標準windows圖元檔案
InvertRect 通過反轉每個像素的值,從而反轉一個裝置場景中特殊的矩形
LineDDA 枚舉指定線段中的所有點
LineTo 用目前畫筆畫一條線,從目前位置連到一個特殊的點
原文連結:
http://ck101.com/forums/viewthread.php?tid=1267712&extra=page%3D1%26amp%3Bfilter%3Dtype%26amp%3Btypeid%3D29
0 意見:
張貼留言張貼留言