FindWindow (user32)
Last changed: 147.78.47.33

.
Summary
The FindWindow function retrieves a handle to the top-level window whose class name and window name match the specified strings. This function does not search child windows. This function does not perform a case-sensitive search. To search child windows, beginning with a specified child window, use the FindWindowEx function.
Alternative

C# Signature:

    /// <summary>
    /// Retrieves a handle to the top-level window whose class name and window name match the specified strings. This function does not search child
    /// windows. This function does not perform a case-sensitive search. To search child windows, beginning with a specified child window, use the
    /// <see cref="!:https://msdn.microsoft.com/en-us/library/windows/desktop/ms633500%28v=vs.85%29.aspx">FindWindowEx</see> function.
    /// <para>
    ///     Go to https://msdn.microsoft.com/en-us/library/windows/desktop/ms633499%28v=vs.85%29.aspx for FindWindow information or
    /// https://msdn.microsoft.com/en-us/library/windows/desktop/ms633500%28v=vs.85%29.aspx for FindWindowEx
    /// </para>
    /// </summary>
    /// <param name="lpClassName">C++ => lpClassName [in, optional]. Type: LPCTSTR
    /// <para/><para/>The class name or a class atom created by a previous call to the RegisterClass or RegisterClassEx function. The atom must be in
    /// the low-order word of lpClassName; the high-order word must be zero.
    /// <para/>If lpClassName points to a string, it specifies the window class name. The class name can be any name registered with RegisterClass or
    /// RegisterClassEx, or any of the predefined control-class names.
    /// <para/>If lpClassName is NULL, it finds any window whose title matches the lpWindowName parameter. </param>
    /// <param name="lpWindowName">C++ => lpWindowName [in, optional]. Type: LPCTSTR
    /// <para/><para/>The window name (the window's title). If this parameter is NULL, all window names match.
    /// </param>
    /// <returns>C++ => Type: HWND
    /// <para/><para/>If the function succeeds, the return value is a handle to the window that has the specified class name and window name.
    /// If the function fails, the return value is NULL.
    /// <para/><para/>To get extended error information, call GetLastError.
    /// </returns>
    /// <remarks>
    /// If the lpWindowName parameter is not NULL, FindWindow calls the <see cref="M:GetWindowText"/> function to retrieve the window name for comparison.
    /// For a description of a potential problem that can arise, see the Remarks for <see cref="M:GetWindowText"/>.
    /// </remarks>
// For Windows Mobile, replace user32.dll with coredll.dll
[DllImport("user32.dll", SetLastError = true)]
static extern IntPtr FindWindow(string lpClassName, string lpWindowName);

// Find window by Caption only. Note you must pass IntPtr.Zero as the first parameter.

[DllImport("user32.dll", EntryPoint="FindWindow", SetLastError = true)]
static extern IntPtr FindWindowByCaption(IntPtr ZeroOnly, string lpWindowName);

// You can also call FindWindow(default(string), lpWindowName) or FindWindow((string)null, lpWindowName)

VB.Net Signature:

<DllImport("user32.dll", SetLastError:=True, CharSet:=CharSet.Auto)> _
Private Shared Function FindWindow( _
     ByVal lpClassName As String, _
     ByVal lpWindowName As String) As IntPtr
End Function

<DllImport("user32.dll", EntryPoint:="FindWindow", SetLastError:=True, CharSet:=CharSet.Auto)> _
Private Shared Function FindWindowByClass( _
     ByVal lpClassName As String, _
     ByVal zero As IntPtr) As IntPtr
End Function

<DllImport("user32.dll", EntryPoint:="FindWindow", SetLastError:=True, CharSet:=CharSet.Auto)> _
Private Shared Function FindWindowByCaption( _
     ByVal zero As IntPtr, _
     ByVal lpWindowName As String) As IntPtr
End Function

Oxygene.Net Signature:

[DllImport("user32.dll", SetLastError := true)]
class method FindWindow(lpClassName, lpWindowName: String): IntPtr; external;

VB Signature (use "FindWindowA" for ANSI return value or "FindWindowW" for Unicode return value) :

Private Declare Function FindWindow Lib "user32" Alias "FindWindowA" (
      ByVal lpClassName As String, _
      ByVal lpWindowName As String) As IntPtr

Private Declare Function FindWindow Lib "user32" Alias "FindWindowW" (
      ByVal lpClassName As String, _
      ByVal lpWindowName  As String) As IntPtr

Boo Signature:

[DllImport("user32", SetLastError : true)]
static def FindWindow(lpClassName as string, lpWindowName as string) as IntPtr:
     pass

User-Defined Types:

None.

Notes:

The FindWindow function retrieves the handle to the top-level window whose class name and window name match the specified strings. This function does not search child windows.

Works hand-in-hand with FindWindowEx

*If lpClassName is NULL FindWindow will search for the window by the lpWindowName (window's title) only. This is useful if the class of a particular window is variable.

Sometimes stored as FindWindowA in DLL

Sample Code (C#):

Think carefully before copying this sample code into your own production code, as it is not a robust solution. It assumes a) Notepad will start within 1/2 second b) the user is using English c) No other applications happen to have "Untitled - Notepad" in their title bar.

          // Find window by Caption, and wait 1/2 a second and then try again.
        public static int FindWindow(string windowName, bool wait)
        {
            int hWnd = FindWindow(null, windowName);
            while (wait && hWnd == 0)
            {
                System.Threading.Thread.Sleep(500);
                hWnd = FindWindow(null, windowName);
            }

            return hWnd;
        }

        // THE FOLLOWING METHOD REFERENCES THE SetForegroundWindow API
        public static bool BringWindowToTop(string windowName, bool wait)
        {
            int hWnd = FindWindow(windowName, wait);
            if (hWnd != 0)
            {
                return SetForegroundWindow((IntPtr)hWnd);
            }
            return false;
        }

//Open Up blank Notepad First !
string lpszParentClass = "Notepad";
string lpszParentWindow = "Untitled - Notepad";
string lpszClass = "Edit";

IntPtr ParenthWnd = new IntPtr(0);
IntPtr hWnd = new IntPtr(0);
ParenthWnd = FindWindow(lpszParentClass,lpszParentWindow);
if (ParenthWnd.Equals(IntPtr.Zero))  
     Console.WriteLine("Notepad Not Running");
else
{
     hWnd = FindWindowEx(ParenthWnd,hWnd,lpszClass,"");
     if (hWnd.Equals(IntPtr.Zero))  
     Console.WriteLine("Notepad doesn't have an edit component ?");
     else
     {
     Console.WriteLine("Notepad Window: " + ParenthWnd.ToString());
     Console.WriteLine("Edit Control: " + hWnd.ToString());
     }
}

Sample Code (VB.net):

'// VB (chellios at gmail dot com)
'// Open up a blank Notepad!
Dim lpszParentClass As String = "Notepad"
Dim lpszParentWindow As String = "Untitled - Notepad"
Dim lpszClass As String = "Edit"

Dim ParenthWnd As New IntPtr(0)
Dim hWnd As New IntPtr(0)

ParenthWnd = FindWindow(lpszParentClass, lpszParentWindow)

If ParenthWnd.Equals(IntPtr.Zero) Then
    Debug.WriteLine("Notepad Not Running!")
Else
    hWnd = FindWindowEx(ParenthWnd, hWnd, lpszClass, "")

    If hWnd.Equals(IntPtr.Zero)
       Debug.WriteLine("Notepad doesn't have an Edit component, how strange.")
    Else
       Debug.WriteLine("Notepad Window: " & ParenthWnd.ToString())
       Debug.WriteLine("Edit Control: " & hWnd.ToString())
    End If
End If

C# Managed Code Alternative to avoid Native calls to FindWindow:

You can avoid using FindWindow which is a native code by calling a combination of Process.GetProcessesByName and Process.MainWindowHandle. This article describes how to do that:

http://www.mycsharpcorner.com/Post.aspx?postID=32

Note 1: This will only find the "main window of a process" if you are trying to locate a child window based on title, this may not be suitable.

Note 2: .Net applications sometimes return a window handle of 0 even when visible using this technique.

VB.NET Code:

    Dim nWnd As IntPtr
    Dim ceroIntPtr As New IntPtr(0)
    Dim Wnd_name as String

    Wnd_name= "Some App Name"
    nWnd = FindWindow(Nothing, Wnd_name)
    'show the info
    If nWnd.Equals(ceroIntPtr) Then
        MsgBox("App Not Running")
    Else
        MsgBox("App Running")
    End If

VB.NET "Slightly" Managed Class (feel free to optimize)

    Public Class FindWindowHandle

#Region " User32 Functions "

    ''' <summary>
    ''' Retrieves a handle to the top-level window whose class name and window name
    ''' match the specified strings. This function does not search child windows.
    ''' This function does not perform a case-sensitive search.
    ''' </summary>
    ''' <param name="lpClassName"></param>
    ''' <param name="lpWindowName"></param>
    ''' <returns></returns>
    ''' <remarks></remarks>
    <DllImport("User32.dll")> _
    Private Shared Function FindWindow(ByVal lpClassName As String, ByVal lpWindowName As String) As Integer
    End Function

    ''' <summary>
    ''' 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 specified child window.
    ''' This function does not perform a case-sensitive search.
    ''' </summary>
    ''' <param name="parentHandle"></param>
    ''' <param name="childAfter"></param>
    ''' <param name="lpszClass"></param>
    ''' <param name="lpszWindow"></param>
    ''' <returns></returns>
    ''' <remarks></remarks>
    <DllImport("user32.dll", SetLastError:=True, CharSet:=CharSet.Auto)> _
    Private Shared Function FindWindowEx(ByVal parentHandle As IntPtr, ByVal childAfter As IntPtr, _
                     ByVal lpszClass As String, ByVal lpszWindow As String) As IntPtr
    End Function

#End Region

#Region " Vars "

    ''' <summary>
    ''' The class name or a class atom created by a previous call to the RegisterClass or RegisterClassEx function.
    ''' If ClassName points to a string, it specifies the window class name.
    ''' The class name can be any name registered with RegisterClass or RegisterClassEx, or any of the predefined control-class names.
    ''' If ClassName is NULL, it finds any window whose title matches the WindowName parameter.
    ''' </summary>
    ''' <value></value>
    ''' <returns></returns>
    ''' <remarks></remarks>
    Private Shared Property ClassName As String

    ''' <summary>
    ''' The window name (the window's title). If this parameter is NULL, all window names match.
    ''' </summary>
    ''' <value></value>
    ''' <returns></returns>
    ''' <remarks></remarks>
    Private Shared Property WindowName As String

    ''' <summary>
    ''' A handle to the parent window whose child windows are to be searched.
    ''' If Parent is NULL, the function uses the desktop window as the parent window.
    ''' The function searches among windows that are child windows of the desktop.
    ''' If Parent is HWND_MESSAGE, the function searches all message-only windows.
    ''' </summary>
    ''' <value></value>
    ''' <returns></returns>
    ''' <remarks></remarks>
    Private Shared Property ParentHandle As IntPtr

    ''' <summary>
    ''' A 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 Parent, not just a descendant window.
    ''' If ChildAfter is NULL, the search begins with the first child window of Parent.
    ''' Note that if both Parent and ChildAfter are NULL, the function searches all top-level and
    ''' message-only windows.
    ''' </summary>
    ''' <value></value>
    ''' <returns></returns>
    ''' <remarks></remarks>
    Private Shared Property ChildHandle As IntPtr

#End Region

    Public Shared ReadOnly Property hwnd_DesktopIcons As IntPtr
        Get
        Return FindWindowEx(IntPtr.Zero, IntPtr.Zero, "Progman", vbNullString)
        End Get
    End Property

    Public Shared ReadOnly Property hwnd_StartBar As IntPtr
        Get
        Return FindWindow("Shell_traywnd", vbNullString)
        End Get
    End Property

    Public Shared ReadOnly Property hwnd_StartBarOrb As IntPtr
        Get
        Return FindWindow("Button", vbNullString)
        End Get
    End Property

    Class GetIt

        Public Shared Function by_ClassName(ByVal value As String)
        Try
            ClassName = value
            Return FindWindow(ClassName, vbNull)
        Catch ex As Exception
            Return vbNull
        End Try
        End Function

        Public Shared Function by_WindowName(ByVal value As String)
        Try
            WindowName = value
            Return FindWindow(vbNull, WindowName)
        Catch ex As Exception
            Return vbNull
        End Try
        End Function

        Public Shared Function by_WindowNameAndClassName(ByVal v_ClassName As String, ByVal v_WindowName As String)
        Try
            ClassName = v_ClassName
            WindowName = v_WindowName
            Return FindWindow(ClassName, WindowName)
        Catch ex As Exception
            Return vbNull
        End Try
        End Function

        Public Shared Function byChildHandle(ByVal v_ChildHandle As IntPtr)
        Try
            ChildHandle = v_ChildHandle
            Return FindWindowEx(IntPtr.Zero, ChildHandle, vbNullString, vbNullString)
        Catch ex As Exception
            Return vbNull
        End Try
        End Function

        Public Shared Function byParentHandle(ByVal v_ParentHandle As IntPtr)
        Try
            ParentHandle = v_ParentHandle
            Return FindWindowEx(ParentHandle, IntPtr.Zero, vbNullString, vbNullString)
        Catch ex As Exception
            Return vbNull
        End Try
        End Function

        Class _byChildHandleAnd

        Public Shared Function andClassName(ByVal v_ChildHandle As IntPtr, _
                                ByVal v_ClassName As String)
            Try
            ChildHandle = v_ChildHandle
            ClassName = v_ClassName
            Return FindWindowEx(IntPtr.Zero, ChildHandle, ClassName, vbNullString)
            Catch ex As Exception
            Return vbNull
            End Try
        End Function

        Public Shared Function andWindowName(ByVal v_ChildHandle As IntPtr, _
                                ByVal v_WindowName As String)
            Try
            ChildHandle = v_ChildHandle
            WindowName = v_WindowName
            Return FindWindowEx(IntPtr.Zero, ChildHandle, vbNullString, WindowName)
            Catch ex As Exception
            Return vbNull
            End Try
        End Function

        Public Shared Function WindowAndClassName(ByVal v_ChildHandle As IntPtr, _
                                ByVal v_ClassName As String, ByVal v_WindowName As String)
            Try
            ChildHandle = v_ChildHandle
            ClassName = v_ClassName
            WindowName = v_WindowName
            Return FindWindowEx(IntPtr.Zero, ChildHandle, ClassName, WindowName)
            Catch ex As Exception
            Return vbNull
            End Try
        End Function

        End Class

        Class _byParentHandleAnd

        Public Shared Function andClassName(ByVal v_ParentHandle As IntPtr, _
                                ByVal v_ClassName As String)
            Try
            ParentHandle = v_ParentHandle
            ClassName = v_ClassName
            Return FindWindowEx(ParentHandle, IntPtr.Zero, ClassName, vbNullString)
            Catch ex As Exception
            Return vbNull
            End Try
        End Function

        Public Shared Function andWindowName(ByVal v_ParentHandle As IntPtr, _
                                ByVal v_WindowName As String)
            Try
            ParentHandle = v_ParentHandle
            WindowName = v_WindowName
            Return FindWindowEx(ParentHandle, IntPtr.Zero, vbNullString, WindowName)
            Catch ex As Exception
            Return vbNull
            End Try
        End Function

        Public Shared Function WindowAndClassName(ByVal v_ParentHandle As IntPtr, _
                                ByVal v_ClassName As String, ByVal v_WindowName As String)
            Try
            ParentHandle = v_ParentHandle
            ClassName = v_ClassName
            WindowName = v_WindowName
            Return FindWindowEx(ParentHandle, IntPtr.Zero, ClassName, WindowName)
            Catch ex As Exception
            Return vbNull
            End Try
        End Function

        End Class

    End Class

    Class Search

        Class Desktop

        Public Shared Function byClassName(ByVal value As String)
            Try
            ClassName = value
            Return FindWindowEx(IntPtr.Zero, IntPtr.Zero, ClassName, vbNullString)
            Catch ex As Exception
            Return vbNull
            End Try
        End Function

        Public Shared Function byWindowName(ByVal value As String)
            Try
            WindowName = value
            Return FindWindowEx(IntPtr.Zero, IntPtr.Zero, vbNullString, WindowName)
            Catch ex As Exception
            Return vbNull
            End Try
        End Function

        Public Shared Function byWindowAndClassName(ByVal v_ClassName As String, ByVal v_WindowName As String)
            Try
            ClassName = v_ClassName
            WindowName = v_WindowName
            Return FindWindowEx(IntPtr.Zero, IntPtr.Zero, ClassName, WindowName)
            Catch ex As Exception
            Return vbNull
            End Try
        End Function

        End Class

        Class MessageOnlyWindows

        Public Shared HWND_MESSAGE As IntPtr = New IntPtr(-3)

        Public Shared Function byClassName(ByVal value As String)
            Try
            ClassName = value
            Return FindWindowEx(HWND_MESSAGE, IntPtr.Zero, ClassName, vbNullString)
            Catch ex As Exception
            Return vbNull
            End Try
        End Function

        Public Shared Function byClassName(ByVal StartingChildHandle As IntPtr, ByVal value As String)
            Try
            ClassName = value
            ChildHandle = StartingChildHandle
            Return FindWindowEx(HWND_MESSAGE, ChildHandle, ClassName, vbNullString)
            Catch ex As Exception
            Return vbNull
            End Try
        End Function

        Public Shared Function byWindowName(ByVal value As String)
            Try
            WindowName = value
            Return FindWindowEx(HWND_MESSAGE, IntPtr.Zero, vbNullString, WindowName)
            Catch ex As Exception
            Return vbNull
            End Try
        End Function

        Public Shared Function byWindowName(ByVal StartingChildHandle As IntPtr, ByVal value As String)
            Try
            WindowName = value
            ChildHandle = StartingChildHandle
            Return FindWindowEx(HWND_MESSAGE, ChildHandle, vbNullString, WindowName)
            Catch ex As Exception
            Return vbNull
            End Try
        End Function

        Public Shared Function byWindowAndClassName(ByVal v_ClassName As String, ByVal v_WindowName As String)
            Try
            ClassName = v_ClassName
            WindowName = v_WindowName
            Return FindWindowEx(HWND_MESSAGE, IntPtr.Zero, ClassName, WindowName)
            Catch ex As Exception
            Return vbNull
            End Try
        End Function

        Public Shared Function byWindowAndClassName(ByVal StartingChildHandle As IntPtr, _
                                ByVal v_ClassName As String, ByVal v_WindowName As String)
            Try
            ClassName = v_ClassName
            WindowName = v_WindowName
            ChildHandle = StartingChildHandle
            Return FindWindowEx(HWND_MESSAGE, ChildHandle, ClassName, WindowName)
            Catch ex As Exception
            Return vbNull
            End Try
        End Function

        End Class

    End Class

    End Class