如何取得小红框内控件句柄和座标位置?
被这些API的组合搞昏头了()Option ExplicitDim hWnd1 As Long, hWnd2 As LongPrivate Sub Command1_Click()
Dim h&
Dim Str As String
    Do
        h = FindWindowEx(hWnd1, h, vbNullString, vbNullString)
        If h <> 0 Then
            GetWindowText h, Str, 255
            Debug.Print Str & " : " & h
            List1.AddItem h
        End If
    Loop Until h = 0
End SubPrivate Sub Form_Load()
Dim h&
    hWnd1 = Shell(App.Path & "\Aprcg.exe", vbHide)
    hWnd1 = FindWindow(vbNullString, "Pattern Reverse Compiler")
    h = FindWindowEx(hWnd1, hWnd2, vbNullString, vbNullString)
End Sub
为啥Form_Load()的FindWindowEx取不到hWnd2
但是Command1_Click()的FindWindowEx却可以?

解决方案 »

  1.   

    FindWindowEx
    The FindWindowEx function retrieves a handle to a window whose class name and window name match the specified strings. The function searches child windows, beginning with the one following the given child window. This function does not perform a case-sensitive search. 
    HWND FindWindowEx(
      HWND hwndParent,      // handle to parent window
      HWND hwndChildAfter,  // handle to a child window
      LPCTSTR lpszClass,    // pointer to class name
      LPCTSTR lpszWindow    // pointer to window name
    );
    Parameters
    hwndParent 
    Handle to the parent window whose child windows are to be searched. 
    If hwndParent is NULL, the function uses the desktop window as the parent window. The function searches among windows that are child windows of the desktop. 
    Windows NT 5.0 and later: If hwndParent is HWND_MESSAGE, the function searches all message-only windows. 
    hwndChildAfter 
    Handle to a child window. The search begins with the next child window in the Z order. The child window must be a direct child window of hwndParent, not just a descendant window. 
    If hwndChildAfter is NULL, the search begins with the first child window of hwndParent. 
    Note that if both hwndParent and hwndChildAfter are NULL, the function searches all top-level and message-only windows. 
    lpszClass 
    Pointer to a null-terminated string that specifies the class name or is an atom that identifies the class-name string. If this parameter is an atom, it must be a global atom created by a previous call to theGlobalAddAtom function. The atom, a 16-bit value, must be placed in the low-order word of lpszClass; the high-order word must be zero. 
    lpszWindow 
    Pointer to a null-terminated string that specifies the window name (the window's title). If this parameter is NULL, all window names match. 
    Return Values
    If the function succeeds, the return value is a handle to the window that has the specified class and window names.
    If the function fails, the return value is NULL. To get extended error information, callGetLastError.为啥Form_Load()的FindWindowEx取不到hWnd2呢,在Form_Load()中的hWnd2的值是NULL,上面说了"If hwndChildAfter is NULL, the search begins with the first child window of hwndParent."如果这个值是NULL则从hwndParent的第一个子控件开始查找.
    执行后h = FindWindowEx(hWnd1, hWnd2, vbNullString, vbNullString)这句后,第一个子控件的hwnd保存在h中,你的Command1_Click()又进行了一次这样的操作.
    h = FindWindowEx(hWnd1, hWnd2, vbNullString, vbNullString)这句没有意义的,h只是个局部变量,一离开作用域就没啦
      

  2.   

    意思是... hWnd2须为NULL时,FindWindowEx才能往下找下一层控件的句柄?先用查找窗口找出指定句柄的窗口,再从中搜寻子控件是用
    FindWindowEx后的返回值,若返回直为0则表示查无子控件。中间也要顺便取得子控件标题而用GetWindowText,
    取得子控件所属类名而用GetClassName,加上循环取得
    所有子控件句柄。那如果要枚举窗口下所有层次的子控件用EnumChildWindows吗?
    一层一层往下找的话实际上要怎写?
    还有怎么依据控件句柄找出控件座标?P.S 是找别的视窗程式的窗口句柄,不是自己找自己。
      

  3.   

    有找到EnumChildWindows实例了,剩找指定控件座标位置的问题。不过理论上用FindWindow + FindWindowEx,
    加上循环应该也可以达到同样目标,只是还不知道要怎写。