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

时间:2012-11-25 02:05:41

标签: c# window title handle

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

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

我尝试了许多不同的方法,但都失败了。 提前谢谢。

6 个答案:

答案 0 :(得分:14)

不要忘记你在循环中声明了你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

答案 1 :(得分:3)

因为你在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;
}

答案 2 :(得分:2)

作为解决此问题的一种选择:

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

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

答案 3 :(得分:1)

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

答案 4 :(得分:0)

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

但值得注意的是,假设您对该功能不做任何其他操作,那么其他人提供的答案有两个问题:

  1. 变量hWnd实际上是不必要的,因为它只用于一件事(作为return的变量)
  2. foreach循环效率低,因为即使您找到了匹配项,您仍会继续搜索其余的进程。实际上,它会返回它找到匹配的最后一个进程。
  3. 假设您不想匹配最后一个流程(第2点),那么这是一个更清洁,更有效的功能:

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

答案 5 :(得分:-1)

#include <windows.h>
#using <System.dll>

using namespace System;
using namespace System::Diagnostics;
using namespace System::ComponentModel;

// get window handle from part of window title
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;
        }
    }
    return hWnd;
}

// get window handle from exact window title
[DllImport("user32.dll")]
private static extern IntPtr FindWindow(string lpClassName, string lpWindowName);

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