2012-11-25 17 views
8

この問題は解決できません。 は、私はエラーを取得する:返信ウィンドウのハンドル名/タイトル

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

それは非常に簡単に聞こえると、おそらくです...ので、明白な質問をして申し訳ありません。

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

は、私は多くの異なる方法で試してみました、それぞれが失敗します。

は、ここに私のコードです。 ありがとうございます。

答えて

11

は、あなたがあなたのループ内hWndを宣言していることを忘れてはいけない - それはループ内でのみ表示だことを意味します。ウィンドウのタイトルが存在しない場合はどうなりますか?あなたはforでそれをしたい場合は、あなたがもしブロック内hWndを宣言しているので、それはにアクセスできない

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

私は** foreachの前にそれを宣言してみました**私は 'return hWnd'行に'未割り当てローカル変数 'hWnd'を使用しているので、ここで尋ねました。 – VixinG

+0

それを 'IntPtr.Zero'に初期化する必要があります(私の編集を見てください)。これは、ウィンドウのタイトルが一致しないためです。したがって、未定義の内容のメモリ領域を指し示す変数を設定することは決してありません。 – Basic

+0

私は、 'IntPtr hwnd = IntPtr.Zero;'である必要があります。 – VixinG

1

hWndは、ループforeachで宣言されています。 そのコンテキストはfoeachループです。その値を得るには、foreachループ外に宣言してください。

はこのようにそれを使用して、

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

...それを返し、ループ内でそれを設定し、あなたのループの外にそれを宣言する必要がありますその外側にあるreturn文。説明のためにhttp://www.blackwasp.co.uk/CSharpVariableScopes.aspxを参照してください。

あなたが提供したコードは、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

両方の人に感謝します。「IntPtr.Zero」はすべてを解決しました – VixinG

0

しかし、他の人が言及したように、hWndの範囲のみですforeachループ。

  1. 変数hWndそれだけのためのものですので、実際には不要です:あなたは機能で他に何もしないしていると仮定すると、ということは注目に値しますが

    、その後、他の人が提供した答えと2つの問題がありますあるもの(returnの変数として)

  2. ループは一致しても、残りのプロセスを検索し続けるので効率的ではありません。実際には、一致した最後のプロセスが返されます。あなたが最後のプロセスと一致したくないと仮定すると

(ポイント#2)、これは、よりクリーンで効率的な機能である:

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

    return IntPtr.Zero; 
} 
関連する問題