I can't solve this problem. I get an error:
The name 'hWnd' does not exist in the current context
It sounds very easy and probably is... sorry for asking so obvious questions.
Here's my code:
public static IntPtr WinGetHandle(string wName)
{
foreach (Process pList in Process.GetProcesses())
{
if (pList.MainWindowTitle.Contains(wName))
{
IntPtr hWnd = pList.MainWindowHandle;
}
}
return hWnd;
}
I tried with many different ways and each fails. Thanks in advance.
hWnd
is declared in theforeach
loop. Its context is insidefoeach
loop. To get its value declare it outsideforeach
loop.Use it like this,
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:
Coming several years late to this but, as others have mentioned, the scope of
hWnd
is only in theforeach
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:
hWnd
is actually unnecessary since it's only being for one thing (as the variable for thereturn
)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:
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 afor
you should declare it outside your loop, set it inside the loop then return it...As an option to solve this problem: