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

文章翻译 文章翻译
文章编号: 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年

属性

文章编号: 147659 - 最后修改: 2006年10月11日 - 修订: 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
关键字:?
kbmt kb32bitonly kbhowto kbprogramming KB147659 KbMtzh
机器翻译
注意:这篇文章是由无人工介入的微软自动的机器翻译软件翻译完成。微软很高兴能同时提供给您由人工翻译的和由机器翻译的文章, 以使您能使用您的语言访问所有的知识库文章。然而由机器翻译的文章并不总是完美的。它可能存在词汇,语法或文法的问题,就像是一个外国人在说中文时总是可能犯这样的错误。虽然我们经常升级机器翻译软件以提高翻译质量,但是我们不保证机器翻译的正确度,也不对由于内容的误译或者客户对它的错误使用所引起的任何直接的, 或间接的可能的问题负责。
点击这里察看该文章的英文版: 147659
Microsoft和/或其各供应商对于为任何目的而在本服务器上发布的文件及有关图形所含信息的适用性,不作任何声明。 所有该等文件及有关图形均"依样"提供,而不带任何性质的保证。Microsoft和/或其各供应商特此声明,对所有与该等信息有关的保证和条件不负任何责任,该等保证和条件包括关于适销性、符合特定用途、所有权和非侵权的所有默示保证和条件。在任何情况下,在由于使用或运行本服务器上的信息所引起的或与该等使用或运行有关的诉讼中,Microsoft和/或其各供应商就因丧失使用、数据或利润所导致的任何特别的、间接的、衍生性的损害或任何因使用而丧失所导致的之损害、数据或利润不负任何责任。

提供反馈

 

Contact us for more help

Contact us for more help
Connect with Answer Desk for expert help.
Get more support from smallbusiness.support.microsoft.com