如何获取窗口句柄不指定精确的标题

注意:这篇文章是由无人工介入的微软自动的机器翻译软件翻译完成。微软很高兴能同时提供给您由人工翻译的和由机器翻译的文章, 以使您能使用您的语言访问所有的知识库文章。然而由机器翻译的文章并不总是完美的。它可能存在词汇,语法或文法的问题,就像是一个外国人在说中文时总是可能犯这样的错误。虽然我们经常升级机器翻译软件以提高翻译质量,但是我们不保证机器翻译的正确度,也不对由于内容的误译或者客户对它的错误使用所引起的任何直接的, 或间接的可能的问题负责。

点击这里察看该文章的英文版: 147659
本文已归档。它按“原样”提供,并且不再更新。
概要
如果您知道确切的窗口标题,Visual Basic AppActivate 命令仅可以激活一个窗口。同样,Windows FindWindow 函数可以只找到一个窗口句柄,如果您知道确切的窗口标题。

本文演示了如何搜索一个窗口,其中有类似于您指定--该标题,但不是完全匹配的标题。通过使用 Visual Basic Like 运算符来比较窗口标题为一种图案在可用窗口搜索该代码示例。您还可以使用示例代码查找一个窗口,根据其类名称或 id。当您需要向其他应用程序发送键击时,这可能是非常有用。
更多信息

FindWindowLike 函数

该代码示例提供了一个名为 FindWindowLike 查找窗口函数。 FindWindowLike 进行递归搜索的匹配为其提供的说明的窗口。完成搜索后, FindWindow 返回它发现符合您的说明的窗口的数量。它还返回传递给它的数组中的窗口句柄。在您有了一个窗口句柄后,可以调用许多 Windows API 函数以对其进行操作。例如对于您可以将焦点设置到该,或移动它。本文中的示例演示如何设置焦点。

传递给 FindWindowLike 函数的参数

FindWindowLike 函数搜索窗口根据传递给它的四个参数:

  • hWndStart 参数指定您要在搜索窗口的句柄。例如对于如果您赋予一个可视的基本窗体的句柄,FindWindowLike 会搜索该窗体上的所有控件。 如果传递的 0 表示 hWndStart FindWindowLike 中搜索所有可用的窗口。
  • WindowText 参数指定用于比较窗口文本模式。Visual Basic 窗体的标题属性是与窗口文本相同。该模式是对 Visual Basic Like 运算符之后准则的任何字符串。
  • ClassName 参数指定用于比较窗口类名的模式。窗口的类名称标识窗口的类型。您可以通过使用该实用程序附带的 Microsoft Visual C/c + +,SPY.EXE 找出一个窗口的类名,或者您可以使用下面 Microsoft 知识库中相应的文章中给出的示例:
    112649如何获取窗口的类名和其他属性
比较的类名时,FindWindowLike 使用 Visual Basic Like 运算符。

  • ID 参数指定一个特定子 id。此参数是用于在窗口中查找特定的控件非常有用。通过使用 SPY.EXE 或下面 Microsoft 知识库中相应的文章中所述的技术,还可以找到窗口的 ID:
    112649如何获取窗口的类名和其他属性
    ID 参数可以是十进制数或十六进制字符串。如果您使用十六进制字符串,前缀的十六进制数与和 $ H.如果您不希望搜索特定的 ID,指定为 ID 的 Null 参数。

FindWindowLike 示例和及其结果

下面是几个示例调用 FindWindowLike 和结果它应该返回:

  1. r = FindWindowLike(hWnds(),0,"*","*"、 Null)
    返回: 所有在可用的窗口。
  2. r = FindWindowLike(hWnds(),0,"* Excel *","*"、 Null)
    返回: 所有窗口的"excel"窗口文本中。
  3. r = FindWindowLike(hWnds(),0,"Microsoft Excel *","XLMAIN"Null)
    返回: 有窗口文本的全部窗口的开始与"Microsoft Excel",并包含类名"XLMAIN"
  4. r = FindWindowLike(hWnds(),Form1.Hwnd,"*","*","& ha1")
    返回: Form1 窗口具有一个 ID 为十六进制 A1 的子窗口。
  5. r = FindWindowLike(hWnds(),Form1.Hwnd,"*","*",2)
    返回: Form1 窗口具有一个 ID 为 2 的子窗口。

用于 FindWindowLike



FindWindowLike 函数可以是一系列的搜索中使用时,尤其是功能强大的。例如对于您可以搜索一次查找一个开放的实例的 PIF 编辑器与 Microsoft Windows 的。再一旦您不得不 PIF 编辑器窗口的句柄,您可以搜索的特定控件的窗口句柄使用 PIF 编辑器的窗口句柄和控件的窗口的 ID。下面是一个示例:
r = FindWindowLike(hWnds(),0,"PIF 编辑器 *","pif"Null)
假设上一个返回至少一个句柄
r = FindWindowLike(hWnds(),hWnds(1),"*","*"、 103)
控件的窗口句柄后,您可以将焦点赋予它并发送它击键。此外,有大量的窗口的句柄后,您可以执行其他操作。

示例代码

在下面的示例中列出的代码示例使用几个 Windows API 函数完成什么上面所述。下面是关键的包括及其用途的说明:

  • GetDeskTopWindow 获取到桌面窗口句柄,因此您可以使用它作为起始点进行递归搜索 hWndStart,作为传递 0 (零) 时。
  • GetWindow 获取基于关系到另一个的窗口句柄,因此您可以使用它来获取子窗口和其同级的窗口句柄。
  • GetWindowText 获取一个窗口,以便进行传递 WindowText 比较的文本。
  • GetClassName 获取可以比较传递 ClassName 您的窗口的类名。
  • GetWindowLong 获取窗口有关的信息。该代码示例使用它来进行比较的一个窗口的 ID 号获取具有 id 已传递的。

分步示例

  1. 开始一个新的标准 EXE 项目。默认情况下创建 Form1。
  2. 向 Form1 中添加三个文字框 (文本 1、 文本 2,和文本 3)。
  3. 将下面的代码在 Form1 中单击事件:
          Private Sub Form_Click()      Static hWnds() As Variant      ' Find window with title "Form1":      r = FindWindowLike(hWnds(), 0, "Form1", "*", Null)      If r = 1 Then      Debug.Print "Found "; Hex(hWnds(1))      ' Find a child window of "Form1" with ID=2:      ' Notice that the handle from the first search is used.      r = FindWindowLike(hWnds(), hWnds(1), "*", "*", "&H00000002")      If r = 1 Then      Debug.Print "Found child "; Hex(hWnds(1))      Debug.Print "Setting focus to child ..."      ' Set the focus to the child window with ID=2:      hw = hWnds(1)      r = SetFocusAPI(hw)      ElseIf r > 1 Then      ' This should not happen.      Debug.Print "Found more than one child ID=2"      Else      Debug.Print "Did not find child ID=2"      End If      ElseIf r > 1 Then      Debug.Print "Found "; r; " Windows"      End If      End Sub						
  4. 从插入菜单中选择向项目添加一个新的模块的模块。
  5. 将下面的代码放在新模块中:
       Declare Function SetFocusAPI Lib "user32" Alias "SetForegroundWindow" _    (ByVal hwnd As Long) As Long   Declare Function GetWindow Lib "user32" (ByVal hwnd As Long, _    ByVal wCmd As Long) As Long   Declare Function GetDesktopWindow Lib "user32" () As Long   Declare Function GetWindowLW Lib "user32" Alias "GetWindowLongA" _    ByVal hwnd As Long, ByVal nIndex As Long) As Long   Declare Function GetParent Lib "user32" (ByVal hwnd As Long) As Long   Declare Function GetClassName Lib "user32" Alias "GetClassNameA" _    (ByVal hwnd As Long, ByVal lpClassName As String, _     ByVal nMaxCount As Long) As Long   Declare Function GetWindowText Lib "user32" Alias "GetWindowTextA" _    (ByVal hwnd As Long, ByVal lpString As String, ByVal cch As Long) _     As Long   Public Const GWL_ID = (-12)   Public Const GW_HWNDNEXT = 2   Public Const GW_CHILD = 5   'FindWindowLike   ' - Finds the window handles of the windows matching the specified   '   parameters   '   'hwndArray()   ' - An integer array used to return the window handles   '   'hWndStart   ' - The handle of the window to search under.   ' - The routine searches through all of this window's children and their   '   children recursively.   ' - If hWndStart = 0 then the routine searches through all windows.   '   'WindowText   ' - The pattern used with the Like operator to compare window's text.   '   'ClassName   ' - The pattern used with the Like operator to compare window's class   '   name.   '   'ID   ' - A child ID number used to identify a window.   ' - Can be a decimal number or a hex string.   ' - Prefix hex strings with "&H" or an error will occur.   ' - To ignore the ID pass the Visual Basic Null function.   '   'Returns   ' - The number of windows that matched the parameters.   ' - Also returns the window handles in hWndArray()   '   '----------------------------------------------------------------------   'Remove this next line to use the strong-typed declarations   #Const WinVar = True   #If WinVar Then   Function FindWindowLike(hWndArray() As Variant, _    ByVal hWndStart As Variant, WindowText As String, _     Classname As String, _  ID) As Integer Dim hwnd   Dim r   Static level   Static iFound   #ElseIf Win32 Then   Function FindWindowLike(hWndArray() As Long, ByVal hWndStart As Long, _    WindowText As String, Classname As String, ID) As Long   Dim hwnd As Long   Dim r As Long   ' Hold the level of recursion:   Static level As Long   ' Hold the number of matching windows:   Static iFound As Long   #ElseIf Win16 Then   Function FindWindowLike(hWndArray() As Integer, _    ByVal hWndStart As Integer, WindowText As String, _    Classname As String, ID) As Integer   Dim hwnd As Integer   Dim r As Integer   ' Hold the level of recursion:   Static level As Integer   Hold the number of matching windows:   Static iFound As Integer   #End If   Dim sWindowText As String   Dim sClassname As String   Dim sID   ' Initialize if necessary:   If level = 0 Then   iFound = 0   ReDim hWndArray(0 To 0)   If hWndStart = 0 Then hWndStart = GetDesktopWindow()   End If   ' Increase recursion counter:   level = level + 1   ' Get first child window:   hwnd = GetWindow(hWndStart, GW_CHILD)   Do Until hwnd = 0   DoEvents ' Not necessary   ' Search children by recursion:   r = FindWindowLike(hWndArray(), hwnd, WindowText, Classname, ID)   ' Get the window text and class name:   sWindowText = Space(255)   r = GetWindowText(hwnd, sWindowText, 255)   sWindowText = Left(sWindowText, r)   sClassname = Space(255)   r = GetClassName(hwnd, sClassname, 255)   sClassname = Left(sClassname, r)   ' If window is a child get the ID:   If GetParent(hwnd) <> 0 Then   r = GetWindowLW(hwnd, GWL_ID)   sID = CLng("&H" & Hex(r))   Else   sID = Null   End If   ' Check that window matches the search parameters:   If sWindowText Like WindowText And sClassname Like Classname Then   If IsNull(ID) Then   ' If find a match, increment counter and   '  add handle to array:   iFound = iFound + 1   ReDim Preserve hWndArray(0 To iFound)   hWndArray(iFound) = hwnd   ElseIf Not IsNull(sID) Then   If CLng(sID) = CLng(ID) Then   ' If find a match increment counter and   '  add handle to array:   iFound = iFound + 1   ReDim Preserve hWndArray(0 To iFound)   hWndArray(iFound) = hwnd   End If   End If   Debug.Print "Window Found: "   Debug.Print "  Window Text  : " & sWindowText   Debug.Print "  Window Class : " & sClassname   Debug.Print "  Window Handle: " & CStr(hwnd)   End If   ' Get next child window:   hwnd = GetWindow(hwnd, GW_HWNDNEXT)   Loop   ' Decrement recursion counter:   level = level - 1   ' Return the number of windows found:   FindWindowLike = iFound   End Function
  6. 保存项目。
  7. 运行在的代码,然后单击窗体。
该程序首先,搜索 Form1。如果找到 Form1,则该程序将 Form1 搜索具有一个 ID 为 2 的控件。由于 Visual Basic 数字 id 添加控件时,它应找到一个。在 Form1 上的三个文本框,与一个应具有一个 ID 为 2。找到控件后, 该代码通过调用 SetFocusAPI 将焦点设置为窗口。

如果您单击窗体前一个您的控件设置焦点您应该看到焦点按住 shift 的始终以相同的控件,当您单击窗体。
参考
Microsoft 开发人员网络库。1997 年一月。平台 SDK 参考。

"visual Basic 程序员指南到 Windows API,"直接 Appleman、 Ziff 戴维斯按,1993年
公共 API api

属性

文章 ID:147659 - 上次审阅时间:12/04/2015 14:15:53 - 修订版本: 2.4

Microsoft Visual Basic Control Creation Edition, Microsoft Visual Basic 5.0 学习版, Microsoft Visual Basic 5.0 专业版, Microsoft Visual Basic 5.0 企业版, Microsoft Visual Basic 4.0 标准版, Microsoft Visual Basic 4.0 专业版, Microsoft Visual Basic 4.0 32-Bit Enterprise Edition

  • kbnosurvey kbarchive kbmt kb32bitonly kbhowto kbprogramming KB147659 KbMtzh
反馈