【发布时间】:2015-01-15 14:22:27
【问题描述】:
我有一个充满进程句柄的数组,现在我正在尝试获取每个进程句柄的相关进程 ID。
但是,我的所有进程 ID 都归零。 谁能指出我遗漏了什么明显的问题?
非常感谢
“子”数组由进程 ID 填充,因此:
currChild = FindWindowEx(hParent, prevChild, null, null);
然后我尝试获取进程ID:
for (int i = 0; i < children.Count; ++i)
{
handle = children[i];
pid = GetProcessId(handle);
Console.WriteLine(children[i].ToString("X") + " : " + pid.ToString());
API:
[DllImport("user32.dll", EntryPoint = "FindWindowEx", CharSet = CharSet.Auto)]
static extern IntPtr FindWindowEx(IntPtr hwndParent, IntPtr hwndChildAfter, string lpszClass, string lpszWindow);
[DllImport("kernel32.dll", EntryPoint = "GetProcessId", CharSet = CharSet.Auto)]
static extern int GetProcessId(IntPtr handle);
输出:
2417E2 : 0
B20D9A : 0
48108C : 0
8809D6 : 0
B5140E : 0
4207F6 : 0
4213B0 : 0
5D15DA : 0
etc ....
【问题讨论】:
-
你的程序有足够的权限吗?尝试使用管理权限运行它
-
什么是
handle?什么是children? -
在 pinvoke 时检查错误绝不是可选的,您没有友好的 .NET 异常来避免麻烦。 GetProcessId() 通过返回 0 指示失败。修复您的 pinvoke 声明并添加 SetLastError = true。并在收到失败指示时抛出 Win32Exception。现在发现程序中的错误变得很容易。
-
汉斯,感谢您的提示...我会添加软管:)