我正在寻找一种方法来获取我的winform应用程序启动的所有excel进程。它甚至可能吗? 如果我可以使用
获取所有正在运行的进程的列表 Process[] processes = Process.GetProcesses();
是不是有办法让某个应用程序启动进程?
答案 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;
}