获取由winform应用程序启动的所有excel进程的列表

本文关键字:excel 进程 列表 获取 winform 应用程序 启动 | 更新日期: 2023-09-27 18:03:36

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

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

不应该有一种方法让进程由某个应用程序启动吗?

获取由winform应用程序启动的所有excel进程的列表

首先将这些名称空间添加到您的应用程序

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

然后在应用程序中引用user32 DLL

class ExcelClass
{
    [DllImport("user32.dll")]
    static extern int GetWindowThreadProcessId(int hWnd, out int lpdwProcessId);
    Process GetId(Excel.Application excelApp)
    {
        int id;
        GetWindowThreadProcessId(excelApp.Hwnd, out id);
        return Process.GetProcessById(id);
    }
}

好吧,我自己找到答案了。我把它分享给大家,以防有人需要。

 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,我就杀死它。

仅供参考,这段代码我用来获得现有的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;
    }