C# 如何获取新打开的应用程序WPF

C# 如何获取新打开的应用程序WPF,c#,wpf,C#,Wpf,有没有办法获取新打开的应用程序?我有一个功能,每10秒获取一次正在运行的应用程序,将它们放在列表框中,如果单击“发送”按钮,将它们发送到另一个窗口 我想做的是获取新打开的应用程序并将其发送到另一个窗口。例如: 在前10秒钟,我打开了记事本和chrome,点击send后,这两个会被发送到另一个窗口。在接下来的10秒钟里,我打开了另一个应用程序firefox。因此,我打开的应用程序现在是记事本、chrome和firefox,所以当我单击send时,我只希望firefox被发送到另一个窗口,这样它就不

有没有办法获取新打开的应用程序?我有一个功能,每10秒获取一次正在运行的应用程序,将它们放在列表框中,如果单击“发送”按钮,将它们发送到另一个窗口

我想做的是获取新打开的应用程序并将其发送到另一个窗口。例如:

在前10秒钟,我打开了记事本和chrome,点击send后,这两个会被发送到另一个窗口。在接下来的10秒钟里,我打开了另一个应用程序firefox。因此,我打开的应用程序现在是记事本、chrome和firefox,所以当我单击send时,我只希望firefox被发送到另一个窗口,这样它就不会是多余的。这可能吗

这是密码,以防有什么帮助

private void SendData()
        {
            String processID = "";
            String processName = "";
            String processFileName = "";
            String processPath = "";
            string hostName = System.Net.Dns.GetHostName();

            listBox1.BeginUpdate();
            try
            {
                for (int i = 0; i < listBox1.Items.Count; i++)
                {
                    piis = GetAllProcessInfos();

                    try
                    {
                        processID = piis[i].Id.ToString();
                        processName = piis[i].Name.ToString();
                        processFileName = piis[i].FileName.ToString();
                        processPath = piis[i].Path.ToString();
                        output.Text += "\n\nSENT DATA : \n\t" + processID + "\n\t" + processName + "\n\t" + processFileName + "\n\t" + processPath + "\n";     
                    }
                    catch (Exception ex)
                    {
                        wait.Abort();
                        output.Text += "Error..... " + ex.StackTrace;

                    }

                    NetworkStream ns = tcpclnt.GetStream();
                    String data = "";
                    data = "--++" + "  " + processID + " " + processPath + " " + processFileName + " " + hostName;
                    if (ns.CanWrite)
                    {
                        byte[] bf = new ASCIIEncoding().GetBytes(data);
                        ns.Write(bf, 0, bf.Length);
                        ns.Flush();
                    }
                }
            }
            finally
            {
                listBox1.EndUpdate();

            } 
        }
private void SendData()
{
字符串processID=“”;
字符串processName=“”;
字符串processFileName=“”;
字符串processPath=“”;
字符串hostName=System.Net.Dns.GetHostName();
listBox1.BeginUpdate();
尝试
{
对于(int i=0;i++++++++++processID++++processPath++++++processFileName++hostName;
如果(ns.CanWrite)
{
byte[]bf=新的AscienceODing().GetBytes(数据);
ns.写入(bf,0,bf.长度);
ns.Flush();
}
}
}
最后
{
listBox1.EndUpdate();
} 
}

将以前发送的进程的Id存储在列表中,并且仅当进程的Id不在列表中时才发送进程信息

private List<int> listedProcesses = new List<int>();

//...

try
{
    if(!listedProcesses.Contains(piis[i].Id)
    {
        listedProcesses.Add(piis[i].Id);
        processID = piis[i].Id.ToString();
        processName = piis[i].Name.ToString();
        processFileName = piis[i].FileName.ToString();
        processPath = piis[i].Path.ToString();
        output.Text += "\n\nSENT DATA : \n\t" + processID + "\n\t" + processName + "\n\t" + processFileName + "\n\t" + processPath + "\n";     
    }
}

//...
private List listedProcesses=new List();
//...
尝试
{
如果(!listedProcesses.Contains)(piis[i].Id)
{
添加(piis[i].Id);
processID=piis[i].Id.ToString();
processName=piis[i].Name.ToString();
processFileName=piis[i].FileName.ToString();
processPath=piis[i].Path.ToString();
output.Text+=“\n\n输入数据:\n\t”+processID+“\n\t”+processName+“\n\t”+processFileName+“\n\t”+processPath+“\n”;
}
}
//...
另外:当您关闭流程时,这两行将不再有效:

for (int i = 0; i < listBox1.Items.Count; i++)
{
    piis = GetAllProcessInfos();
for(int i=0;i
因为进程的数量现在可以低于列表框中的项目数量

要使它们保持同步,还必须在进程关闭时从列表框中删除项目


要更有效(更简单)地修复它,您只需清除列表框,并为GetAllProcessInfos()返回的每个进程添加一个新项;

有一个钩子,如下所述:


非常好。感谢您的快速响应,先生。非常感谢。发现了一个错误。为什么每次我立即关闭应用程序时它都会出错?下面是指向列表的错误:索引超出范围。必须是非负的,并且小于集合的大小。参数名:Index。@helpmeplease-我在谢谢你,先生,但我不知道怎么做。这对我来说都是新鲜事
using System.Management;

// Run this in another thread and make sure you dispose the event watcher before exit

var start = new ManagementEventWatcher(new WqlEventQuery("SELECT * FROM Win32_ProcessStartTrace"));    

start.EventArrived += new EventArrivedEventHandler(delegate (object sender, EventArrivedEventArgs e) {
    console.WriteLine("Name: {0}, Command Line: {1}", e.NewEvent.Properties["ProcessName"].Value, e.NewEvent.Properties["Commandline"].Value);
});

start.Start()