2012-11-25 10 views
8

Ich kann dieses Problem nicht lösen. Ich erhalte eine Fehlermeldung:Return Window Handle von seinem Namen/Titel

The name 'hWnd' does not exist in the current context 

Es klingt sehr einfach und wahrscheinlich ist ... sorry für so offensichtlich, Fragen zu stellen.

Hier ist mein Code:

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

Ich habe versucht, mit vielen verschiedenen Möglichkeiten und jede ausfällt. Vielen Dank im Voraus.

Antwort

11

Vergessen Sie nicht, Sie erklären Sie hWnd innerhalb der Schleife - die es nur sichtbar innerhalb der Schleife bedeutet. Was passiert, wenn der Fenstertitel nicht existiert? Wenn Sie es mit einem for tun wollen, sollten Sie es außerhalb der Schleife deklarieren, legen Sie es in der Schleife dann zurückkehren ...

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 
+0

Ich versuchte es vor ** foreach erklärt ** und ich habe 'Verwendung der nicht zugewiesenen lokalen Variable' hWnd'' in 'return hWnd' Zeile, darum habe ich hier gefragt. – VixinG

+0

Dann sollten Sie es zu "IntPtr.Zero" initialisieren (siehe meine Bearbeitung). Dies liegt daran, dass der Fenstertitel nicht übereinstimmt. Sie legen also niemals die Variable fest, die auf einen Speicherbereich mit nicht definierten Inhalten zeigt. – Basic

+0

Ich sehe, es sollte sein "IntPtr hwnd = IntPtr.Zero;" :) – VixinG

1

hWnd wird in der foreach Schleife erklärt. Sein Kontext ist innerhalb foeach Schleife. Um seinen Wert zu erhalten, deklarieren Sie es außerhalb foreach Schleife.

Verwenden es so,

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

Weil Sie hWnd innerhalb des if-Block deklarieren, ist es unzugänglich für die Return-Anweisung, die außerhalb ist. Siehe http://www.blackwasp.co.uk/CSharpVariableScopes.aspx zur Klarstellung.

Der Code, den Sie zur Verfügung gestellt haben kann, indem die Deklaration der Variable hWnd festgesetzt:

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; 
} 
+0

Danke euch beide, 'IntPtr.Zero' hat alles gelöst – VixinG

0

Kommen mehrere Jahre so spät, aber, wie andere schon erwähnt haben, ist der Umfang der hWnd nur in der foreach Schleife.

aber es ist erwähnenswert, dass, vorausgesetzt, Sie nichts anderes mit der Funktion tun, dann gibt es zwei Probleme mit den Antworten, die andere zur Verfügung gestellt haben:

  1. Die Variable hWnd sind eigentlich nicht notwendig, da es nur Sein für eine Sache (wie die Variable für die return)
  2. Die foreach Schleife ist ineffizient, als, selbst nachdem Sie eine Übereinstimmung gefunden haben, Sie weiterhin den Rest der Prozesse suchen. In der Tat wird es den letzten gefundenen Prozess zurückgeben, der übereinstimmt.

Unter der Annahme, dass Sie nicht den letzten Prozess (Punkt 2) übereinstimmen sollen, dann ist dies ein saubere und effiziente Funktion:

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

    return IntPtr.Zero; 
}