At one point I came across an interesting programming problem. Windows has 4 similar, but different functions for Finding a Window in it's API. Having the below code, would it be possible to combine the two Select Case statements into one function and assign which Findwindow function to use on a variable so the correct one could be called at a latter time without another Select Case structure?


Before, needing two Select Case structures because you're doing two different events:
Code:
    Private Sub txtClassName_TextChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles txtClassName.TextChanged, txtWindowCaption.TextChanged
        Select Case True
            Case txtWindowCaption.Text.Length.Equals(0) AndAlso txtClassName.Text.Length.Equals(0)
                lblFunctionCalled.Text = "FindWindow (ClassName As Integer, WindowName As Integer) will be called."
            Case txtWindowCaption.Text.Length.Equals(0) AndAlso Not txtClassName.Text.Length.Equals(0)
                lblFunctionCalled.Text = "FindWindow (ClassName As String, WindowName As Integer) will be called."
            Case txtWindowCaption.Text.Length.Equals(0) AndAlso txtClassName.Text.Length.Equals(0)
                lblFunctionCalled.Text = "FindWindow (ClassName As Integer, WindowName As String) will be called."
            Case Else
                lblFunctionCalled.Text = "FindWindow (ClassName As String, WindowName As String) will be called."
        End Select
    End Sub

    Private Sub btnShow_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnShow.Click
        Dim hWnd As IntPtr

        Select Case True
            Case txtWindowCaption.Text.Length.Equals(0) AndAlso txtClassName.Text.Length.Equals(0)
                hWnd = Win32API.FindWindowAny(0, 0)
            Case txtWindowCaption.Text.Length.Equals(0) AndAlso Not txtClassName.Text.Length.Equals(0)
                hWnd = Win32API.FindWindowNullWindowCaption(txtClassName.Text, 0)
            Case Not txtWindowCaption.Text.Length.Equals(0) AndAlso txtClassName.Text.Length.Equals(0)
                hWnd = Win32API.FindWindowNullClassName(0, txtWindowCaption.Text)
            Case Else
                hWnd = Win32API.FindWindow(txtClassName.Text, txtWindowCaption.Text)
        End Select
    End Sub


After, assigning our different functions to a lambda and calling it. Look how much cleaner the code is!:
Code:
    Private lambda As Func(Of String, String, IntPtr)

    Private Sub txtClassName_TextChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles txtClassName.TextChanged, txtWindowCaption.TextChanged
        Select Case True
            Case txtWindowCaption.Text.Length.Equals(0) AndAlso txtClassName.Text.Length.Equals(0)
                lblFunctionCalled.Text = "FindWindow (ClassName As Integer, WindowName As Integer) will be called."
                lambda = Function(a As String, b As String) Win32API.FindWindowAny(0, 0)

            Case txtWindowCaption.Text.Length.Equals(0) AndAlso Not txtClassName.Text.Length.Equals(0)
                lblFunctionCalled.Text = "FindWindow (ClassName As String, WindowName As Integer) will be called."
                lambda = Function(a As String, b As String) Win32API.FindWindowNullWindowCaption(a, 0)

            Case Not txtWindowCaption.Text.Length.Equals(0) AndAlso txtClassName.Text.Length.Equals(0)
                lblFunctionCalled.Text = "FindWindow (ClassName As Integer, WindowName As String) will be called."
                lambda = Function(a As String, b As String) Win32API.FindWindowNullClassName(0, b)

            Case Else
                lblFunctionCalled.Text = "FindWindow (ClassName As String, WindowName As String) will be called."
                lambda = Function(a As String, b As String) Win32API.FindWindow(a, b)

        End Select
    End Sub

    Private Sub btnShow_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnShow.Click
        Dim hWnd As IntPtr = lambda(txtClassName.Text, txtWindowCaption.Text)
    End Sub