返回窗口句柄的名称/标题

我无法解决这个问题。 我收到一个错误:

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

我尝试了许多不同的方式,每个都失败了。 提前致谢。

不要忘记你是在声明你在循环内部 – 这意味着它只在循环中可见。 如果窗口标题不存在会发生什么? 如果你想用a做它你应该在你的循环之外声明它,在循环中设置它然后返回它…

  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 

因为你在if块中声明了hWnd ,所以它不在它之外的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; } 

hWndforeach循环中声明。 它的上下文是在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; } 

比较晚几年,但正如其他人提到的那样, hWnd的范围仅在foreach循环中。

然而值得注意的是,假设您对该function没有任何其他function,那么其​​他人提供的答案有两个问题:

  1. 变量hWnd实际上是不必要的,因为它只用于一件事(作为return的变量)
  2. foreach循环效率很低,因为即使找到匹配项,您仍然会继续搜索其余的进程。 实际上,它会返回它找到匹配的最后一个进程。

假设您不想匹配最后一个进程(第2点),那么这是一个更干净,更有效的function:

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