2012-11-25 19 views
8

Non riesco a risolvere questo problema. ottengo un errore:Gestione della finestra di ritorno in base al nome/titolo

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

Sembra molto semplice e, probabilmente, è ... scusa per porre domande così ovvie.

Ecco il mio codice:

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

Ho provato con molti modi diversi e ognuno fallisce. Grazie in anticipo.

risposta

11

Non dimenticare che stai dichiarando che si hWnd all'interno del ciclo - che significa che è visibile solo all'interno del ciclo. Cosa succede se il titolo della finestra non esiste? Se si vuole fare con un for si dovrebbe dichiararla fuori del vostro ciclo, impostarlo all'interno del ciclo poi tornare ...

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

Ho provato a dichiararlo prima di ** ** foreach e ho ottenuto l'uso della variabile locale non assegnata "hWnd" nella riga "return hWnd', ecco perché ho chiesto qui. – VixinG

+0

Quindi dovresti inizializzarlo su 'IntPtr.Zero' (vedi la mia modifica). Questo perché il titolo della finestra non viene corrisposto, quindi non si sta mai impostando la variabile che punta a un'area della memoria con contenuti indefiniti. – Basic

+0

Vedo, dovrebbe essere 'IntPtr hwnd = IntPtr.Zero;' :) – VixinG

1

hWnd è dichiarato nel ciclo foreach. Il contesto è all'interno del ciclo foeach. Per ottenere il suo valore dichiararlo fuori dal ciclo foreach.

usare in questo modo,

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

Perché si dichiara hWnd all'interno del blocco if, è inaccessibile al dichiarazione di ritorno che è al di fuori di esso. Vedi http://www.blackwasp.co.uk/CSharpVariableScopes.aspx per chiarimenti.

Il codice che hai fornito può essere fissato spostando la dichiarazione della variabile 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

Grazie a entrambi, "IntPtr.Zero' ha risolto tutto – VixinG

0

Venendo diversi anni di ritardo a questo, ma, come altri hanno già detto, il campo di applicazione hWnd è solo nel foreach ciclo.

Tuttavia vale la pena notare che, supponendo che si sta facendo niente altro con la funzione, poi ci sono due problemi con le risposte che altri hanno fornito:

  1. La variabile hWnd è in realtà inutile dal momento che è di essere solo per una cosa (come la variabile per lo return)
  2. Il ciclo foreach non è efficiente in quanto, anche dopo aver trovato una corrispondenza, si continua a cercare il resto dei processi. In realtà, restituirà l'ultimo processo in cui trova le corrispondenze.

Partendo dal presupposto che non si desidera far corrispondere l'ultimo processo (punto # 2), allora questo è un pulitore e la funzione più efficiente:

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

    return IntPtr.Zero; 
} 
Problemi correlati