VBA:GDI和用户对象

时间:2015-08-04 14:09:28

标签: excel vba excel-vba

我正在为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...

1 个答案:

答案 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");
    }
}