2012-11-25 26 views
8

Nie mogę rozwiązać tego problemu. pojawia się błąd:Uchwyt okna powrotu według nazwy/tytułu

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

Brzmi to bardzo proste i zapewne ... przepraszam za pytanie tak oczywistych pytań.

Oto mój kod:

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

Próbowałem wiele różnych sposobów, a każdy kończy się niepowodzeniem. Z góry dzięki.

Odpowiedz

11

Nie zapomnij jesteś deklarowania Ci hWnd wewnątrz pętli - co oznacza, że ​​jest widoczne tylko wewnątrz pętli. Co się stanie, jeśli tytuł okna nie istnieje? Jeśli chcesz to zrobić z for powinien zadeklarować go poza pętli, ustawić ją wewnątrz pętli następnie odesłać go ...

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

Próbowałem deklarowania przed ** ** foreach i otrzymałem 'Use of nieprzypisana zmienna lokalna 'hWnd'' w' return hWnd' line, dlatego spytałem tutaj. – VixinG

+0

Następnie powinieneś zainicjować go na 'IntPtr.Zero' (zobacz moją edycję). Dzieje się tak dlatego, że tytuł okna nie jest dopasowywany - więc nigdy nie ustawiasz zmiennej, która wskazuje obszar pamięci o niezdefiniowanej zawartości. – Basic

+0

Rozumiem, powinno to być 'IntPtr hwnd = IntPtr.Zero;' :) – VixinG

1

hWnd jest zadeklarowany w pętli foreach. Jego kontekst znajduje się wewnątrz pętli foeach. Aby uzyskać jego wartość, zadeklaruj ją poza pętlą foreach.

używać go tak,

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

Bo deklarują hWnd wewnątrz bloku if, jest niedostępne dla instrukcja return, która znajduje się poza nią. Aby uzyskać wyjaśnienia, patrz http://www.blackwasp.co.uk/CSharpVariableScopes.aspx.

Kod podasz może być ustalony przez przeniesienie deklaracji zmiennej 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; 
} 
+0

Dziękuję wam obojgu, 'IntPtr.Zero' rozwiązał wszystko – VixinG

0

Coming kilkuletnie późno na to, ale jak wspominają inni, zakres hWnd jest tylko w foreach pętla.

Jednak warto zauważyć, że przy założeniu robisz nic innego z funkcją, to istnieją dwa problemy z odpowiedziami inni dostarczyć:

  1. Zmienna hWnd jest rzeczywiście konieczne, ponieważ to jest tylko dla jedna rzecz (jako zmienna dla return)
  2. Pętla jest nieefektywna, ponieważ, nawet po znalezieniu dopasowania, nadal przeszukujesz pozostałe procesy. W rzeczywistości zwróci on ostatni znaleziony proces, który pasuje.

Zakładając, że nie chcesz, aby dopasować ostatniego procesu (punkt nr 2), to jest czystsze i bardziej wydajne funkcje:

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

    return IntPtr.Zero; 
}