tags:

views:

43

answers:

4

I realize this is a very specific question, and not very helpful outside of this scenario, although I am sure it applies to other questions with the same problem. I have a function to recursively search through windows (and their child windows) to find specific ones, it works exactly as expected, however it causes "function doesn't return a value on all paths" warning. This is the only warning in my entire program, and although it might be silly, I'm interested in knowing if there is a way to stop this error from occurring, but still allowing the function to work properly.

    Public Function FindQWidgetWindows() As Integer
    Dim hWndStart As Integer = 0
    Dim WindowText As String = "*"
    Dim Classname As String = "QWidget"
    Dim hwnd As Integer
    Dim sWindowText As String
    Dim sClassname As String
    Dim r As Integer
    Static level As Integer

    If level = 0 Then
        If hWndStart = 0 Then hWndStart = GetDesktopWindow()
    End If

    level = level + 1

    hwnd = GetWindow(hWndStart, GW_CHILD)

    Do Until hwnd = 0
        Call FindQWidgetWindows()

        'Get the window text and class name'
        sWindowText = Space$(255)
        r = GetWindowText(hwnd, sWindowText, 255)
        sWindowText = Microsoft.VisualBasic.Left(sWindowText, r)
        sClassname = Space$(255)
        r = GetClassName(hwnd, sClassname, 255)
        sClassname = Microsoft.VisualBasic.Left(sClassname, r)

        If (sWindowText Like WindowText) And (sClassname Like Classname) Then
            Dim aRECT As RECT
            Dim hwndInt As Int32 = hwnd
            GetWindowRect(hwndInt, aRECT)
            FindQWidgetWindows = hwnd

            'uncommenting the next line causes the routine to'
            'only return the first matching window.'
            'Exit Do'

        End If

        hwnd = GetWindow(hwnd, GW_HWNDNEXT)

    Loop

    level = level - 1
End Function
+1  A: 

Yes, you can get rid of this error by ensuring every path returns a value.

This can be done by simply initialising the return value at the top of the function:

FindQWidgetWindows = Nothing

But you have another problem that you're probably not seeing because your desired window is at the top level. If you recurse into your function, the hWndStart will once again be set to the desktop, not the child window.

paxdiablo
Yes, that's why it's a Function, and it IS returning the parent window to work correctly recursively.
Frustrated Guy
A: 

In your code the below code will be executed only if the If condition is satisfied.

FindQWidgetWindows = hwnd

Which also means if the If condition is not satisfied nothing will be returned.

Shoban
I orginally tried changing that to FindQWidgetWindows = hwnd Else FindQWidgetWindows = Nothingbut that didn't solve the warning. - and apparently I'm not smart enough to use code tags in a comment.
Frustrated Guy
A: 

You have declared the function (Public Function FindQWidgetWindows() As Integer) as returning a integer but the function doesn't return anything. Just ensure that you return an integer using the Return statement.

Suresh Kumar
+1  A: 

You rely on the fact, that VB automatically declares a return variable with the name of your function. This variable can be used as any other variable in your function. So it also can get a default initialization.

As already mentioned, you only assign a value in a very nested If statement. You should simply initialize your variable outside and before of your Do-loop with something like

FindQWidgetWindows = Nothing
WizzardsApprentice
Thanks, I was trying to fix the return in the (very) nested If's, but assigning the Nothing value prior to the loop fixed the warning. I appreciate your answer.
Frustrated Guy