FindWindow使用方法

 Declare Function FindWindow Lib "user32" Alias "FindWindowA" (ByVal lpClassName As String, ByVal lpWindowName As String) As Long
這個函數有兩個參數,第一個是要找的窗口的類,第二個是要找的窗口的標題。在搜索的時候不一定兩者都知道,但至少要知道其中的一個。有的窗口的標題是比較容易得到的,如"計算器",所以搜索時應使用標題進行搜索。但有的軟件的標題不是固定的,如"記事本",如果打開的文件不同,窗口標題也不同,這時使用窗口類搜索就比較方便。如果找到了滿足條件的窗口,這個函數返回該窗口的句柄,否則返回0。
前面提到的VB的FindWindow()函數的聲明將兩個參數都定義爲String類型,而在實際使用過程中,如果我們忽略某個參數就將該參數的定義又As String改爲As Any。這裏的As Any相當於C語言中的強制類型轉換。例如,如果我們忽略窗口的類,就將定義修改如下:
Declare Function FindWindow Lib "user32" Alias "FindWindowA" (ByVal lpClassName As Any, ByVal lpWindowName As String) As Long
然後,在調用時使用如下語句:
hwndCalc = FindWindow(0&, "計算器")
這裏的0&就表示忽略類名。需要注意的是FindWindow(0&, "計算器")和FindWindow("", "計算器")有兩種完全不同的含義,前者表示忽略窗口的類,而後者表示窗口的類是個空串。類似的,我們也可以忽略標題而搜索指定的類。
從上面的討論中可以看出,如果要搜索的外部程序的窗口標題比較容易得到,問題是比較簡單的。可如果窗口的標題不固定或者根本就沒有標題,怎麼得到窗口的類呢?如果你安裝了Visual C++,你可以使用其中的Spy++(如果沒有VC++,在VB的盤上也可以找到Spy),在Spy++中有一個FindWindow工具,它允許你使用鼠標選擇窗口,然後Spy++會顯示這個窗口的類。
在Win32 API中還有一個FindWindowEx,它非常適合尋找子窗口。
用法示例
Option Explicit
Private Declare Function FindWindow Lib "user32" Alias "FindWindowA" ( _
    ByVal lpClassName As String, _
    ByVal lpWindowName As String) As Long
Private Declare Function PostMessage Lib "user32" Alias "PostMessageA" ( _
    ByVal hWnd As Long, _
    ByVal wMsg As Long, _
    ByVal wParam As Long, lParam As Any) As Long
   
Private Declare Function GetClassName Lib "user32" Alias "GetClassNameA" ( _
    ByVal hWnd As Long, _
    ByVal lpClassName As String, _
    ByVal nMaxCount As Long) As Long
   
Private Declare Function ShowWindow Lib "user32" ( _
    ByVal hWnd As Long, _
    ByVal nCmdShow As Long) As Long
   
Const SW_SHOWNORMAL = 1
Const WM_CLOSE = &H10
Public Sub test()
    Dim hWnd As Long
   
    '不知道類名
    hWnd = FindWindow(vbNullString, "計算器")
    Debug.Print hWnd
End Sub
Public Sub test2()
    Dim hWnd As Long
   
    '知道計算器窗口的類名是: SciCalc
    hWnd = FindWindow("SciCalc", vbNullString)
    Debug.Print hWnd
End Sub
Public Sub Test3()
    Dim hWnd As Long
    Dim lpClassName As String
    Dim retVal As Long
   
    hWnd = FindWindow(vbNullString, "計算器")
    If hWnd = 0 Then MsgBox "Couldn't find the window ...": Exit Sub
   
    'Show the window
    ShowWindow hWnd, SW_SHOWNORMAL
   
    'Create a buffer
    lpClassName = Space(256)
   
    'retrieve the class name
    retVal = GetClassName(hWnd, lpClassName, 256)
   
    'Show the classname
    Debug.Print "Classname: " + Left(lpClassName, retVal)
   
    'Post a message to the window to close it
    PostMessage hWnd, WM_CLOSE, 0&, 0&
End Sub

發佈了214 篇原創文章 · 獲贊 11 · 訪問量 27萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章