有没有办法获得新开的应用程序?我有一个功能,每10秒钟运行一次,将它们放在列表框上,如果单击“发送”按钮,则将它们发送到另一个窗口。
我想要的是获取新打开的应用程序并将其发送到另一个窗口。例如:
前10秒,我打开记事本和chrome,点击发送后,这两个将被发送到另一个窗口。在接下来的10秒内,我打开了另一个应用程序,它是firefox。所以我打开的应用程序现在是记事本,chrome和firefox所以当我点击发送时,我只希望将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();
}
}
答案 0 :(得分:2)
将先前发送的进程的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";
}
}
//...
另外:关闭进程时,这两行将不再有效:
for (int i = 0; i < listBox1.Items.Count; i++)
{
piis = GetAllProcessInfos();
因为进程数现在可以低于列表框中的项目数。
要使它们保持同步,您还必须在关闭进程时从列表框中删除项目。
为了更有效(更容易)修复它,您只需清除列表框并为GetAllProcessInfos()返回的每个进程添加一个新项;
答案 1 :(得分:0)
如此处所述:How to hook into application and process startup in windows?
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()