vb.net递归函数exit function退不出函数,该如何处理

vb.net递归函数exit function退不出函数
各位朋友,看看是怎么回事,符合条件时Return fHwnd退不出来。
当程序执行到Return fHwnd,我断点下在这,按F11时,下一句是执行end function,再下句会跳到我在代码中标注“会再次执行这句”

    Public Const GW_CHILD = 5
    Public Const GW_HWNDNEXT = 2
    Public Declare Function GetClassName Lib "USER32" Alias "GetClassNameA" (ByVal hwnd As Integer, ByVal lpClassName As String, ByVal nMaxCount As Integer) As Integer
    Public Declare Function GetWindow Lib "user32" (ByVal hWnd As Integer, ByVal wCmd As Integer) As Integer
    '按类名获取子窗口句柄
    Public Function FindControlHwndByClassName(ByVal nHwnd As Long, ByVal clsName As String) As Long
        Dim fHwnd As Long, myStr As String, sHwnd As Long
        fHwnd = GetWindow(nHwnd, GW_CHILD)
        If fHwnd = 0 Then
            Return fHwnd
        End If
        Do While fHwnd > 0
            myStr = Space(100)
            GetClassName(fHwnd, myStr, 100)
            If InStr(myStr, clsName) > 0 Then
                Return fHwnd’检测到条件符合,无法退出函数
            End If
            sHwnd = GetWindow(fHwnd, GW_CHILD)
            If sHwnd > 0 Then
                FindControlHwndByClassName(fHwnd, clsName)‘会再次执行这句
            End If
            fHwnd = GetWindow(fHwnd, GW_HWNDNEXT)
        Loop
        Return fHwnd
    End Function
'调用代码
    Dim a1 As Long = FindControlHwndByClassName(461452, "Shell DocObject View")
        Debug.Print(a1)


------解决思路----------------------
不可能,你调试下,是不是看错了调用关系。
或者你试试看Return语句。
------解决思路----------------------
return FindControlHwndByClassName(fHwnd, clsName)‘会再次执行这句
------解决思路----------------------
我修改了您的代码,您的问题在于函数内的Return。
Return语句不是调用后自动退出函数体,Return语句通常在于函数体内的最后位置,以便返回结果值。
然后,End Function来直接退出函数体。

您的情况是If Then 语句 不是唯一的情况下Return不是一个而是多个,所以,Exit Function 来阻止继续往下执行。
 
最正确下的方法是修改 If Then 语句,请看看我的第二个回复里的代码。

[code=vb]
Public Class Form1
    Public Const GW_CHILD = 5
    Public Const GW_HWNDNEXT = 2
    Public Declare Function GetClassName Lib "USER32" Alias "GetClassNameA" (ByVal hwnd As Integer, ByVal lpClassName As String, ByVal nMaxCount As Integer) As Integer
    Public Declare Function GetWindow Lib "user32" (ByVal hWnd As Integer, ByVal wCmd As Integer) As Integer
    Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
      
   
    '调用代码
    Dim a1 As Long = FindControlHwndByClassName(461452, "Shell DocObject View")
        Debug.Print(a1)

    End Sub
    '按类名获取子窗口句柄
    Public Function FindControlHwndByClassName(ByVal nHwnd As Long, ByVal clsName As String) As Long
        Dim fHwnd As Long, myStr As String, sHwnd As Long
        fHwnd = GetWindow(nHwnd, GW_CHILD)
        If fHwnd = 0 Then
            Return fHwnd
            Exit Function
        End If
        Do While fHwnd > 0