我正在为Excel(2007/2010)创建一个宏,它收集有关该过程的信息并在指定的单元格中显示它。到目前为止,我无法获得GDI / User对象,但我可以获得句柄等。
我用它来完成这个过程:
Set oServ = GetObject("winmgmts:")
Set cProc = oServ.ExecQuery("Select * from Win32_Process")
然后我找到了我正在寻找的过程并获取Peak Working Set内存,Handles等。我尝试使用GetGuiResources来获取GDI / User Objects但我无法让它在指定的进程中工作(返回0)。我读了post,据说它使用OpenProcess,但这也不起作用。
Range(CStr(Cell_Holder)).Value = GetGuiResources(jProc.Handle, 0) 'jProc is the process wanted
Range(CStr(Cell_Holder)).Value = GetGuiResources(GetCurrentProcess, 0)' this works...
答案 0 :(得分:0)
由于WMI-Query返回Win32_Process
对象,但GetGuiResources
需要hWND
(窗口句柄),因此必须从Win32_Process获取句柄。不幸的是,这是不 Win32_Process的Handle
成员。
您可以使用System.Diagnostics.Process
类来获取所需的窗口句柄。在C#中,您将执行以下操作:
using System.Diagnostics;
using System.Management;
const int GR_GDIOBJECTS = 0;
// ...
String wmiQuery = "select * from Win32_Process";
ManagementObjectSearcher search = new ManagementObjectSearcher(wmiQuery);
ManagementObjectCollection processList = search.Get();
foreach (ManagementObject obj in processList)
{
int pid = (int)(uint)obj["ProcessId"];
Process p = Process.GetProcessById((int)pid);
String name = p.ProcessName;
try
{
int handleCount = GetGuiResources(p.Handle, GR_GDIOBJECTS);
Console.WriteLine(name + ": " + handleCount);
}
catch
{
Console.WriteLine(name + ": Access denied");
}
}