Renvoie le handle de fenêtre par son nom/titre
Je ne peux pas résoudre ce problème. Je reçois une erreur:
The name 'hWnd' does not exist in the current context
Cela semble très facile et c'est probablement ... désolé de poser des questions aussi évidentes.
Voici mon code:
public static IntPtr WinGetHandle(string wName)
{
foreach (Process pList in Process.GetProcesses())
{
if (pList.MainWindowTitle.Contains(wName))
{
IntPtr hWnd = pList.MainWindowHandle;
}
}
return hWnd;
}
J'ai essayé de différentes manières et chacune a échoué. Merci d'avance.
N'oubliez pas que vous vous déclarez hWnd
à l'intérieur de la boucle - ce qui signifie qu'elle n'est visible qu'à l'intérieur de la boucle. Que se passe-t-il si le titre de la fenêtre n'existe pas? Si vous voulez le faire avec une for
, vous devez le déclarer en dehors de votre boucle, le placer dans la boucle puis le retourner ...
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
Parce que vous déclarez hWnd
à l'intérieur du bloc if, il est inaccessible à l'instruction return qui se trouve en dehors de celui-ci. Voir http://www.blackwasp.co.uk/CSharpVariableScopes.aspx pour plus de précisions.
Le code que vous avez fourni peut être corrigé en déplaçant la déclaration de la variable hWnd:
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;
}
hWnd
est déclaré dans la boucle foreach
. Son contexte est dans la boucle foeach
. Pour obtenir sa valeur, déclarez-le en dehors de la boucle foreach
.
Utilisez-le comme ça,
public static IntPtr WinGetHandle(string wName){
IntPtr hWnd = NULL;
foreach (Process pList in Process.GetProcesses())
if (pList.MainWindowTitle.Contains(wName))
hWnd = pList.MainWindowHandle;
return hWnd;
}
En option pour résoudre ce problème:
[DllImport("user32.dll")]
private static extern IntPtr FindWindow(string lpClassName, string lpWindowName);
public IntPtr GetHandleWindow(string title)
{
return FindWindow(null, title);
}
Vous arrivez avec plusieurs années de retard, mais, comme d'autres l'ont mentionné, la portée de hWnd
ne concerne que la boucle foreach
.
Toutefois, il convient de noter que, si vous ne faites rien d'autre avec la fonction, les réponses fournies par les autres utilisateurs posent deux problèmes:
- La variable
hWnd
est en fait inutile, car elle n’est que pour une chose (comme la variable pour lareturn
) - La boucle
foreach
est inefficace car, même après avoir trouvé une correspondance, vous continuez à rechercher le reste des processus. En fait, il retournera le dernier processus trouvé qui correspond.
En supposant que vous ne vouliez pas correspondre au dernier processus (point n ° 2), il s'agit d'une fonction plus propre et plus efficace:
public static IntPtr WinGetHandle(string wName)
{
foreach (Process pList in Process.GetProcesses())
if (pList.MainWindowTitle.Contains(wName))
return pList.MainWindowHandle;
return IntPtr.Zero;
}