Return Window handle by it's name / title

Update: See Richard's Answer for a more elegant approach.

Don't forget you're declaring you hWnd inside the loop - which means it's only visible inside the loop. What happens if the window title doesn't exist? If you want to do it with a for you should declare it outside your loop, set it inside the loop then return it...

IntPtr hWnd = IntPtr.Zero;
foreach (Process pList in Process.GetProcesses())
{
    if (pList.MainWindowTitle.Contains(wName))
    {
        hWnd = pList.MainWindowHandle;
    }
}
return hWnd; //Should contain the handle but may be zero if the title doesn't match

Or in a more LINQ-y way....

IntPtr? handle = Process
    .GetProcesses()
    .SingleOrDefault(x => x.MainWindowTitle.Contains(wName))
    ?.Handle;
return handle.HasValue ? handle.Value : IntPtr.Zero

Because you are declaring hWnd inside the if block, it is inaccessible to the return statement which is outside it. See http://www.blackwasp.co.uk/CSharpVariableScopes.aspx for clarification.

The code you've provided can be fixed by moving the declaration of the hWnd variable:

public static IntPtr WinGetHandle(string wName)
{
    IntPtr hwnd = IntPtr.Zero;
    foreach (Process pList in Process.GetProcesses())
    {
        if (pList.MainWindowTitle.Contains(wName))
        {
            hWnd = pList.MainWindowHandle;
        }
    }
    return hWnd;
}

Coming several years late to this but, as others have mentioned, the scope of hWnd is only in the foreach loop.

However it's worth noting that, assuming you're doing nothing else with the function, then there are two issues with the answers others have provided:

  1. The variable hWnd is actually unnecessary since it's only being for one thing (as the variable for the return)
  2. The foreach loop is inefficient as, even after you've found a match, you continue to search the rest of the processes. In actual fact, it'll return the last process it finds that matches.

Assuming that you don't want to match the last process (point #2), then this is a cleaner and more efficient function:

public static IntPtr WinGetHandle(string wName)
{
    foreach (Process pList in Process.GetProcesses())
        if (pList.MainWindowTitle.Contains(wName))
            return pList.MainWindowHandle;

    return IntPtr.Zero;
}