找子視窗要用SPY++////////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 看裡面的引數,第一個和第二個:ByVal hWnd1 As Long,ByVal hWnd2 As Long,這裡都需要傳入控制代碼,再看第三個和第四個:ByVal lpsz1 As String, ByVal lpsz2 As String,這裡所要傳入的是字串。具體意思如下: hWnd1 ---------- Long,在其中查詢子的父視窗。如設為零,表示使用桌面視窗(通常說的頂級視窗都被認為是桌面的子視窗,所以也會對它們進行查詢) hWnd2 ---------- Long,從這個視窗後開始查詢。這樣便可利用對FindWindowEx的多次呼叫找到符合條件的所有子視窗。如設為零,表示從第一個子視窗開始搜尋 lpsz1 ---------- String,欲搜尋的類名。零表示忽略,注意一般傳入vbNullString lpsz2 ---------- String,欲搜尋的類名。零表示忽略,注意一般傳入vbNullString 用實踐幫我們分析,這裡還是拿記事本開刀。開啟一個記事本,新建一個標準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,看看能不能在記事本的文字框中輸入字串?是否被禁用了?
找子視窗要用SPY++////////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 看裡面的引數,第一個和第二個:ByVal hWnd1 As Long,ByVal hWnd2 As Long,這裡都需要傳入控制代碼,再看第三個和第四個:ByVal lpsz1 As String, ByVal lpsz2 As String,這裡所要傳入的是字串。具體意思如下: hWnd1 ---------- Long,在其中查詢子的父視窗。如設為零,表示使用桌面視窗(通常說的頂級視窗都被認為是桌面的子視窗,所以也會對它們進行查詢) hWnd2 ---------- Long,從這個視窗後開始查詢。這樣便可利用對FindWindowEx的多次呼叫找到符合條件的所有子視窗。如設為零,表示從第一個子視窗開始搜尋 lpsz1 ---------- String,欲搜尋的類名。零表示忽略,注意一般傳入vbNullString lpsz2 ---------- String,欲搜尋的類名。零表示忽略,注意一般傳入vbNullString 用實踐幫我們分析,這裡還是拿記事本開刀。開啟一個記事本,新建一個標準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,看看能不能在記事本的文字框中輸入字串?是否被禁用了?