从“Windows任务管理器”进程列表中获取项目c#

时间:2013-10-02 13:59:19

标签: c# .net winforms pinvoke listviewitem

我试图从#34; Windows任务管理器"中获取所有项目。进程列表并将它们添加到我的应用程序中的列表框中。我找到了代码来获取任务管理器上的进程列表的句柄。我有代码使用其索引从列表中删除项目(这是测试我有正确句柄的好方法)。但我需要c#代码来获取进程列表中的项目总数,并通过索引获取项目。生病了,只需简单地按顺序获取所有项目并将它们添加到我的列表框中。

编辑:感谢您的评论,我将解释更多...... 我不是只想列出进程,否则我会使用:System.Diagnostics.Process.GetProcesses(); 我希望按照在任务管理器中排序的方式对进程进行排序。 任务管理器有许多方法可以对其流程进行分类。它提供了大约31种不同的方法。例如:图像名称,PID,用户名,CPU使用率等。我的目标是按照任务管理器中的顺序获取流程。

    static Int32 LVM_FIRST = 4096;
    static Int32 LVM_DELETEITEM = (LVM_FIRST + 8);
    static Int32 LVM_SORTITEMS = (LVM_FIRST + 48);

    [DllImport("user32.dll", EntryPoint = "FindWindowA")]
    private static extern Int32 apiFindWindow(string lpClassName, string lpWindowName);

    [DllImport("user32.dll", EntryPoint = "FindWindowExA")]
    private static extern Int32 apiFindWindowEx(Int32 hWnd1, Int32 hWnd2, string lpsz1, string lpsz2);

    [DllImport("user32.dll", EntryPoint = "SendMessageA")]
    private static extern Int32 apiSendMessage(Int32 hWnd, Int32 wMsg, Int32 wParam, string lParam);

    [DllImport("user32.dll", EntryPoint = "GetDesktopWindow")]
    private static extern Int32 apiGetDesktopWindow();


    void GetItems()
    {
        Int32 lhWndParent = apiFindWindow(null, "Windows Task Manager");
        Int32 lhWndProcessList = 0;
        Int32 lhWndDialog = 0;

        for (int i = 1; (i <= 7); i++)
        {
            // Loop through all seven child windows, for handle to the listview
            lhWndDialog = apiFindWindowEx(lhWndParent, lhWndDialog, null, null);
            if ((lhWndProcessList == 0))
            {
                lhWndProcessList = apiFindWindowEx(lhWndDialog, 0, "SysListView32", "Processes");
            }
        }


        /* This code removes the first item in the Task Manager Processes list:
         * apiSendMessage(lhWndProcessList, LVM_DELETEITEM, 0, "0");
         * note that the 3rd paramiter: 0, is the index of the item to delete.
         * I put it here in comments because I thought there would be
         * something similar to get the name*/

        listBox1.Items.Clear();

        int TotalItemCount = /*Total item count in Task Manager Processes list*/;
        for (int i = 0; i < TotalItemCount; i++)
        {
            listBox1.Items.Add(/*Get item  in Task Manager Processes list by index: i*/)

        }

    }

2 个答案:

答案 0 :(得分:2)

我同意评论者不要重新发明轮子。你可以得到这样的过程并排序:

System.Diagnostics.Process[] myProcs = System.Diagnostics.Process.GetProcesses();

var sorted = myProcs.OrderBy(p => p.UserProcessorTime);

答案 1 :(得分:0)

根据我的理解,user2838881想要了解Windows 7中的进程 在Windows机器上排序。任务管理器运行时有多种方法 进程已排序。由于这个事实,为了使用建议作为答案的代码,他必须找到一种方法来通过编程对任务管理器中的进程进行排序。 实现这一目标的一种方法是在删除进程之前可以在代码中添加以下代码行。

        apiSendMessage(lhWndProcessList,LVM_SORTITEMS,0,"0")