我解决不了这个问题。 我得到一个错误:
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;
}
我试着用很多不同的方式和每个失败。 提前致谢。
不要忘了你你声明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
因为你声明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;
}
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;
}
作为解决该问题的一个选择:
[DllImport("user32.dll")]
private static extern IntPtr FindWindow(string lpClassName, string lpWindowName);
public IntPtr GetHandleWindow(string title)
{
return FindWindow(null, title);
}
未来几年下旬到这一点,但,正如其他人所提到的,范围hWnd
仅在foreach
循环。
然而值得注意的是,假设你正在做几乎没有别的功能,那么与其他人提供的答案两个问题:
- 变量
hWnd
实际上是不必要的,因为它是唯一的一件事(作为变量return
) - 该
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;
}