我无法解决这个问题。 我收到一个错误:
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;
}
我尝试了许多不同的方法,但都失败了。 提前谢谢。
答案 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)
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;
}
答案 4 :(得分:0)
迟到几年,但正如其他人所提到的那样,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;
}
答案 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);
}