再看第二個FindWindowEx,這個API是在視窗列表中尋找與指定條件相符的第一個子視窗,原型如下:
Private Declare Function FindWindowEx Lib "user32" Alias "FindWindowExA" (ByVal hWnd1 As Long, ByVal hWnd2 As Long, ByVal lpsz1 As String, ByVal lpsz2 As String) As Long
看堶悸滌捊ヾA第一個和第二個:ByVal hWnd1 As Long,ByVal hWnd2 As Long,這堻˙搨n傳入控制碼,再看第三個和第四個:ByVal lpsz1 As String, ByVal lpsz2 As String,這堜珥n傳入的是字串。具體意思如下:
hWnd1 ----------
Long,在其中查找子的父視窗。如設為零,表示使用桌面視窗(通常說的頂級視窗都被認為是桌面的子視窗,所以也會對它們進行查找)
hWnd2 ----------
Long,從這個視窗後開始查找。這樣便可利用對FindWindowEx的多次調用找到符合條件的所有子視窗。如設為零,表示從第一個子視窗開始搜索
lpsz1 ----------
String,欲搜索的類名。零表示忽略,注意一般傳入vbNullString
lpsz2 ----------
String,欲搜索的類名。零表示忽略,注意一般傳入vbNullString
用實踐幫我們分析,這媮椄O拿記事本開刀。打開一個記事本,新建一個標準EXE,接著新建一個CommandButton,Caption設置為:設置文本。OK,寫入以下代碼:
Private Declare Function FindWindow Lib "user32" Alias "FindWindowA" (ByVal lpClassName As String, ByVal lpWindowName As String) As Long
Private Declare Function FindWindowEx Lib "user32" Alias "FindWindowExA" (ByVal hWnd1 As Long, ByVal hWnd2 As Long, ByVal lpsz1 As String, ByVal lpsz2 As String) As Long
Private Declare Function EnableWindow Lib "user32" (ByVal hwnd As Long, ByVal fEnable As Long) As Long
Private Sub Command1_Click()
Dim WindowHandle As Long, ChildWindowHandle As Long
WindowHandle = FindWindow(vbNullString, "無標題 - 記事本")
If WindowHandle Then '如果獲取控制碼成功
ChildWindowHandle = FindWindowEx(WindowHandle, 0, "Edit", vbNullString)
If ChildWindowHandle Then '如果成功獲取子控制碼
EnableWindow ChildWindowHandle, False '禁用子窗口
Else
MsgBox "無法獲取子窗口"
End If
End If
End Sub
好了,幫大家分析。看第一行:Dim WindowHandle As Long, ChildWindowHandle As Long,用於儲存獲取的控制碼的。WindowHandle = FindWindow(vbNullString, "無標題 - 記事本")這個就不用講了,上面已經講過。
ChildWindowHandle = FindWindowEx(WindowHandle, 0, "Edit", vbNullString),這一段是通過我們已經獲取的記事本控制碼獲取其中的子視窗控制碼。大家可以用Spy++查看到記事本的TextBox類,然後根據類名寫入即可。
EnableWindow ChildWindowHandle, False 這又是一個新的API,雖然前面我沒有前過,但是這個API使用起來及其簡單。這個API中有兩個參數,第一個理所當然是傳入視窗控制碼,第二個為Long變數,其實這媕雩茬]為Boolean變數好些,主要是用來處理當前視窗是否可用。True可用,False禁用。
現在F5運行,記得打開記事本哦,然後點擊Command1,看看能不能在記事本的文本框中輸入字串?是否被禁用了?
小提示:EnableWindow之所有講出來,是希望提高大家使用API的興趣,有些被禁用的視窗你可以使用這個API把它啟動,
至於怎麼使用就看你自己了,這媯馱j家佈置一個作業,呵呵,自己去完成吧。
最後一個API,WindowFromPoint,這個API主要是獲取當前座標的視窗控制碼,不是有人想知道當前滑鼠指標位置的視窗控制碼嗎?
用這個是不錯的選擇,原型如下:
Private Declare Function WindowFromPoint Lib "user32" Alias "WindowFromPoint" (ByVal xPoint As Long, ByVal yPoint As Long) As Long
兩個參數,一個是xPoint(x座標值),一個是yPoint(y座標值),現在你可以在這個兩個參數分別傳入其他視窗的座標值就可以獲取其他視窗的控制碼了。
可以看到為Function聲明,返回值就是咱們需要的控制碼。
咱們想實現的功能是獲取當前滑鼠指標位置的控制碼,所以這媟穔M需要用到GetCursorPos了,結合前面所講的,新建一個標準EXE,添加一個Timer控制項,Interval設置為100,Enabled=True,OK,寫如以下代碼:
Private Declare Function WindowFromPoint Lib "user32" (ByVal xPoint As Long, ByVal yPoint As Long) As Long
Private Declare Function GetCursorPos Lib "user32" (lpPoint As POINTAPI) As Long
Private Type POINTAPI
x As Long
y As Long
End Type
Private Sub Timer1_Timer()
Dim lpPoint As POINTAPI
Dim WindowHandle As Long
GetCursorPos lpPoint '獲取當前滑鼠指標座標
WindowHandle = WindowFromPoint(lpPoint.x, lpPoint.y)
Me.Caption = "當前滑鼠指標位置控制碼:" & WindowHandle
End Sub
好了,最後一次給大家分析了,至於GetCursorPos的使用與說明前面已經講過,這堣ㄕA分析。
看看WindowHandle = WindowFromPoint(lpPoint.x, lpPoint.y)這句,它是通過GetCursorPos獲取的滑鼠座標值獲取當前滑鼠座標位置的控制碼。
最後一句我就不用說了,在程式視窗顯示獲取的控制碼。
好了,API入門已經告一段落,其實我還想寫下去,不過似乎看的人多,回應的人少,很是打擊我寫下去的心情。不過還是希望大家能從上面學到一些知識。具體的API應用我就不多說,大家可以自己慢慢體會。如果你把以上我講的全部都搞懂的話,那麼證明你已經基本瞭解API的使用方法了,那下面就靠你自己了。至此,我希望我帶了一個好頭幫助你瞭解API。
|