获取由winform应用程序启动的所有excel进程的列表
本文关键字:excel 进程 列表 获取 winform 应用程序 启动 | 更新日期: 2023-09-27 18:03:36
我正在寻找一种方法来获得我的winform应用程序启动的所有excel进程。这可能吗?如果我可以使用
获取所有运行进程的列表 Process[] processes = Process.GetProcesses();
不应该有一种方法让进程由某个应用程序启动吗?
首先将这些名称空间添加到您的应用程序
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;
}