16

この問題を解決できません。エラーが発生します:

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

私は多くの異なる方法で試しましたが、いずれも失敗しました。前もって感謝します。

4

7 に答える 7

19

更新:よりエレガントなアプローチについては、Richard's Answerを参照してください。

ループ内で宣言していることを忘れないでください。hWndつまり、ループ内でのみ表示されます。ウィンドウのタイトルが存在しない場合はどうなりますか? a でそれを行いたい場合はfor、ループの外側で宣言し、ループの内側に設定してから返す必要があります...

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

または、よりLINQ-yの方法で....

IntPtr? handle = Process
    .GetProcesses()
    .SingleOrDefault(x => x.MainWindowTitle.Contains(wName))
    ?.Handle;
return handle.HasValue ? handle.Value : IntPtr.Zero
于 2012-11-25T02:10:08.847 に答える
4

if ブロック内で宣言しているためhWnd、その外側にある return ステートメントにはアクセスできません。詳細については、 http: //www.blackwasp.co.uk/CSharpVariableScopes.aspx を参照してください。

提供したコードは、hWnd 変数の宣言を移動することで修正できます。

public static IntPtr GetWindowHandleByTitle(string wName)
{
    IntPtr hWnd = IntPtr.Zero;
    foreach (Process pList in Process.GetProcesses())
    {
        if (pList.MainWindowTitle.Contains(wName))
        {
            hWnd = pList.MainWindowHandle;
        }
    }
    return hWnd;
}
于 2012-11-25T02:13:12.333 に答える
1

hWndforeachループ内で宣言されています。そのコンテキストはfoeachloop内にあります。その値を取得するには、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;
}
于 2012-11-25T02:10:06.647 に答える