VBA:GDI和用户对象

我正在为Excel(2007/2010)创build一个macros,该macros收集有关进程的信息并将其显示在指定的单元格中。 到目前为止,我不能得到GDI /用户对象,但我可以得到处理等。

我用这个来得到这个过程:

Set oServ = GetObject("winmgmts:") Set cProc = oServ.ExecQuery("Select * from Win32_Process") 

然后我find了我正在寻找的进程,并抓住峰值工作集内存,句柄等我已经尝试使用GetGuiResources抓取GDI /用户对象,但我无法得到它的指定进程(返回0)的工作。 我读了一篇文章 ,说它使用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... 

由于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"); } }