web-dev-qa-db-fra.com

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.

10
VixinG

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
13
Basic

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;
}
3
Mitch

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;
}
1
Shiplu Mokaddim

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);
} 
1
Wizard

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:

  1. La variable hWnd est en fait inutile, car elle n’est que pour une chose (comme la variable pour la return)
  2. 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;
}
0
Richard