获取winform application

时间:2016-08-23 04:44:11

标签: c# .net vb.net winforms

我正在寻找一种方法来获取我的winform应用程序启动的所有excel进程。它甚至可能吗? 如果我可以使用

获取所有正在运行的进程的列表
 Process[] processes = Process.GetProcesses();

是不是有办法让某个应用程序启动进程?

3 个答案:

答案 0 :(得分:1)

首先将此命名空间添加到您的应用程序

None

然后在你的应用程序参考user32 dll

using Excel = Microsoft.Office.Interop.Excel;
using System.Runtime.InteropServices;
using System.Diagnostics;

答案 1 :(得分:0)

好的,我自己找到了答案。我正在分享它以防万一有人需要它。

 int myappid = Process.GetCurrentProcess().Id;
            Process[] processes = Process.GetProcessesByName("EXCEL");          

            foreach (Process prs in processes)
            {
                var query = string.Format("SELECT ParentProcessId FROM Win32_Process WHERE ProcessId = {0}", prs.Id);
                var search = new ManagementObjectSearcher("root\\CIMV2", query);
                var results = search.Get().GetEnumerator();
                results.MoveNext();
                var queryObj = results.Current;
                var parentId = (uint)queryObj["ParentProcessId"];

                if (ProcessExists((int)parentId))
                {
                    var parent = Process.GetProcessById((int)parentId);

                    if (parent.Id == myappid)
                    {
                        prs.Kill();
                    }
                }
            }

 private bool ProcessExists(int id)
        {
            return Process.GetProcesses().Any(x => x.Id == id);
        }

在上面的代码中Process[] processes = Process.GetProcesses();会给我所有的过程。我正在循环收集并查找每个的父进程ID。如果父ID与我的应用程序进程ID匹配,并且子进程的名称是excel,我将其终止。

答案 2 :(得分:0)

仅仅是一个FYI,这段代码我用来获取现有的excel进程,然后杀死我的应用程序创建的excel进程。

Hashtable myHashtable;



    private void Get_Already_Running_Excel()
    {
        Process[] AllProcesses = Process.GetProcessesByName("excel");
        myHashtable = new Hashtable();
        int iCount = 0;

        foreach (Process ExcelProcess in AllProcesses)
        {
            myHashtable.Add(ExcelProcess.Id, iCount);
            iCount = iCount + 1;
        }
    }

    public void Close_User_Excel()
    {
        Process[] AllProcesses = Process.GetProcessesByName("excel");       

        // check to kill the right process
        foreach (Process ExcelProcess in AllProcesses)
        {
            if (myHashtable.ContainsKey(ExcelProcess.Id) == false)
            { ExcelProcess.Kill(); }
        }

        AllProcesses = null;
    }