用findwindows只能得到顶级的那个窗口句柄,用什么方法可以得到每一个窗口句柄阿?

解决方案 »

  1.   

    FindWindowEx VB声明 
    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 
    说明 
    在窗口列表中寻找与指定条件相符的第一个子窗口 
    返回值 
    Long,找到的窗口的句柄。如未找到相符窗口,则返回零。会设置GetLastError 
    参数表 
    参数 类型及说明 
    hWnd1 Long,在其中查找子的父窗口。如设为零,表示使用桌面窗口(通常说的顶级窗口都被认为是桌面的子窗口,所以也会对它们进行查找) 
    hWnd2 Long,从这个窗口后开始查找。这样便可利用对FindWindowEx的多次调用找到符合条件的所有子窗口。如设为零,表示从第一个子窗口开始搜索 
    lpsz1 String,欲搜索的类名。零表示忽略 
    lpsz2 String,欲搜索的类名。零表示忽略 ==================================
    用这个,可以接着上一次找到的接着找 
      

  2.   

    一楼的,我不太明白怎么用,我这样那里错了阿,为什么另一个计算器总是返回0阿。
    Private Sub Command1_Click()
    Dim a As String
    Dim b As String
    a = FindWindow(vbNullString, "计算器")
    MsgBox a
    b = FindWindowEx(a, 0&, 0&, 0&)
    MsgBox b
    End Sub
      

  3.   

    当然错了,你的意思是获取CAPTION一样的几个顶级窗口的句柄,FINDWINDOWEX是在母体里找,不返回0还返回什么?
    这个问题只有ENUMwindows来找,在回调函数里做标题匹配。
    如果是子窗体就用enumchildwindows,其他操作基本一样,获取已知句柄的窗口标题用GetWindowText
      

  4.   

    楼上的正解,我要的就是标题名称相同的几个窗体的句柄,只能用enumwindows枚举然后一个一个对应标题阿,那会不会很慢阿?如果只列出任务条上的程序怎么弄?
      

  5.   

    不要忘了,所有顶级窗体的“母体”都是HWND_DESKTOP=0&,所以用FindWindowEx是没有错的。
      

  6.   

    Option Explicit
    Private Declare Function FindWindowEx Lib "user32" Alias "FindWindowExA" (ByVal hWnd1 As Long, ByVal hWnd2 As Long, ByVal lpsz1 As Long, ByVal lpsz2 As String) As Long
    Private Declare Function FindWindow Lib "user32" Alias "FindWindowA" (ByVal lpClassName As Long, ByVal lpWindowName As String) As LongPrivate Sub Form_Load()    Dim hFirst As Long, hNext As Long
        Dim strTitle As String
        
        strTitle = "计算器"
        
        hFirst = FindWindow(0&, strTitle)
        If hFirst = 0 Then Exit Sub
        
        MsgBox "First Found"
        hNext = hFirst
        
        Do
            hNext = FindWindowEx(0&, hNext, 0&, strTitle)
            If hNext = 0 Then Exit Do
            
            MsgBox "Another Found"
        Loop
    End Sub
      

  7.   

    跟楼上的一样,只是api参数类型不一样
    Option Explicit
    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 FindWindow Lib "user32" Alias "FindWindowA" (ByVal lpClassName As String, ByVal lpWindowName As String) As Long
    Private Sub Form_Load()
        Dim FindDesk As Long, FindNotepad As Long, More As Long, Count As Integer
        FindDesk& = FindWindow("Notepad", vbNullString)
       If FindDesk <> 0 Then
       MsgBox "第一个找到 " & Hex(FindDesk)
       Count = 1
       End If
        More = FindDesk
        
        Do While More <> 0
            More = FindWindowEx(0&, More, "Notepad", vbNullString)
            If More = 0 Then Exit Do
            Count = Count + 1
            MsgBox "第" & Count & "个找到 " & Hex(More)
        Loop
    End Sub