通过它的名称/标题返回窗口句柄(Return Window handle by it's n

2019-07-04 02:56发布

我解决不了这个问题。 我得到一个错误:

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

我试着用很多不同的方式和每个失败。 提前致谢。

Answer 1:

不要忘了你你声明hWnd内环路-这意味着它是只在循环里可见。 如果窗口标题不存在,会发生什么? 如果你想用做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


Answer 2:

因为你声明hWnd if块里面,它是望洋兴叹了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;
}


Answer 3:

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


Answer 4:

作为解决该问题的一个选择:

[DllImport("user32.dll")]
private static extern IntPtr FindWindow(string lpClassName, string lpWindowName);

public IntPtr GetHandleWindow(string title)
{
    return FindWindow(null, title);
} 


Answer 5:

未来几年下旬到这一点,但,正如其他人所提到的,范围hWnd仅在foreach循环。

然而值得注意的是,假设你正在做几乎没有别的功能,那么与其他人提供的答案两个问题:

  1. 变量hWnd实际上是不必要的,因为它是唯一的一件事(作为变量return
  2. foreach因为,你已经找到了一个匹配后,也你继续搜索过程的其余部分循环是低效的。 其实不然,它会返回的最后一个进程找到匹配。

假设你不想匹配的最后一个进程(点#2),那么这是一个更清洁,更高效的功能:

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

    return IntPtr.Zero;
}


文章来源: Return Window handle by it's name / title