C# 如何检测新进程是否在计时器c上运行#

C# 如何检测新进程是否在计时器c上运行#,c#,winforms,process,C#,Winforms,Process,我如何确定一个新进程是否正在运行(不是特定的,只是任何一个新进程),并使用计时器中的图标将其添加到listView 目前我有这个,它所做的就是重置listview,不管是否有新进程。我希望它不要重置listview,而是将新的listview添加到listview中。同样,删除不再存在的进程 public UserControl5() { InitializeComponent(); } [StructLayout(Lay

我如何确定一个新进程是否正在运行(不是特定的,只是任何一个新进程),并使用计时器中的图标将其添加到listView

目前我有这个,它所做的就是重置listview,不管是否有新进程。我希望它不要重置listview,而是将新的listview添加到listview中。同样,删除不再存在的进程

public UserControl5()
        {
            InitializeComponent();
        }

        [StructLayout(LayoutKind.Sequential)]
        public struct SHFILEINFO
        {
            public IntPtr hIcon;
            public IntPtr iIcon;
            public uint dwAttributes;
            [MarshalAs(UnmanagedType.ByValTStr, SizeConst = 260)]
            public string szDisplayName;
            [MarshalAs(UnmanagedType.ByValTStr, SizeConst = 80)]
            public string szTypeName;
        };

        class Win32
        {
            public const uint SHGFI_ICON = 0x100;
            public const uint SHGFI_LARGEICON = 0x0;    // 'Large icon
            public const uint SHGFI_SMALLICON = 0x1;    // 'Small icon

            [DllImport("shell32.dll")]
            public static extern IntPtr SHGetFileInfo(string pszPath,
                                        uint dwFileAttributes,
                                        ref SHFILEINFO psfi,
                                        uint cbSizeFileInfo,
                                        uint uFlags);
        }

        private int nIndex = 0;
        private void UserControl5_Load(object sender, EventArgs e)
        {
            timer1.Enabled = true;


        }
private void timer1_Tick(object sender, EventArgs e)
        {
            listView1.Items.Clear();
            listView1.View = View.Details;
            listView1.Columns.Clear();
            listView1.Columns.Add("Processes");
            listView1.AutoResizeColumns(ColumnHeaderAutoResizeStyle.HeaderSize);

            IntPtr hImgSmall;    //the handle to the system image list
            IntPtr hImgLarge;    //the handle to the system image list
            string fName;        // 'the file name to get icon from
            SHFILEINFO shinfo = new SHFILEINFO();

            listView1.SmallImageList = imageList1;
            listView1.LargeImageList = imageList1;


            Process[] processlist = Process.GetProcesses();

            foreach (Process process in processlist)
            {
                try
                {
                    String fileName = process.MainModule.FileName;
                    String processName = process.ProcessName;
                    hImgSmall = Win32.SHGetFileInfo(fileName, 0, ref shinfo,
                                                  (uint)Marshal.SizeOf(shinfo),
                                                   Win32.SHGFI_ICON |
                                                   Win32.SHGFI_SMALLICON);

                    //Use this to get the large Icon
                    //hImgLarge = SHGetFileInfo(fName, 0,
                    //ref shinfo, (uint)Marshal.SizeOf(shinfo),
                    //Win32.SHGFI_ICON | Win32.SHGFI_LARGEICON);
                    //The icon is returned in the hIcon member of the shinfo
                    //struct
                    System.Drawing.Icon myIcon = System.Drawing.Icon.FromHandle(shinfo.hIcon);

                    imageList1.Images.Add(myIcon);

                    //Add file name and icon to listview



                    listView1.Items.Add(Path.GetFileName(System.IO.Path.GetFileNameWithoutExtension(fileName)), nIndex++);
                    //nIndex++


                }
                catch
                {

                }
            }
            }

private void listView1_SelectedIndexChanged(object sender, EventArgs e)
        {
            if (listView1.SelectedIndices.Count <= 0)
            {
                return;
            }
            int intselectedindex = listView1.SelectedIndices[0];
            if (intselectedindex >= 0)
            {
                textBox1.Text = listView1.Items[intselectedindex].Text;
            }
        }
public UserControl5()
{
初始化组件();
}
[StructLayout(LayoutKind.Sequential)]
公共结构SHFILEINFO
{
公共IntPtr hIcon;
公共INTR iIcon;
公共单位属性;
[Marshallas(UnmanagedType.ByValTStr,SizeConst=260)]
公共字符串名称;
[Marshallas(UnmanagedType.ByValTStr,SizeConst=80)]
公共字符串类型名;
};
类Win32
{
公共警察SHGFI_图标=0x100;
警察SHGFI_LARGEICON=0x0;/“大图标
公共警察SHGFI_SMALLICON=0x1;/“小图标
[DllImport(“shell32.dll”)]
公共静态外部IntPtr SHGetFileInfo(字符串pszPath,
uint dwFileAttributes,
参考SHFILEINFO psfi,
uint CBSIZEFLEINFO,
uint uFlags);
}
私有整数nIndex=0;
私有void UserControl5_加载(对象发送方,事件参数e)
{
timer1.Enabled=true;
}
私有无效计时器1_刻度(对象发送方,事件参数e)
{
listView1.Items.Clear();
listView1.View=View.Details;
listView1.Columns.Clear();
listView1.Columns.Add(“进程”);
listView1.AutoResizeColumns(ColumnHeaderAutoResizeStyle.HeaderSize);
IntPtr hImgSmall;//系统映像列表的句柄
IntPtr hImgLarge;//系统映像列表的句柄
字符串fName;//'要从中获取图标的文件名
SHFILEINFO shinfo=新的SHFILEINFO();
listView1.SmallImageList=imageList1;
listView1.LargeImageList=imageList1;
Process[]processlist=Process.getprocesss();
foreach(进程列表中的进程)
{
尝试
{
字符串文件名=process.MainModule.fileName;
字符串processName=process.processName;
hImgSmall=Win32.SHGetFileInfo(文件名,0,参考shinfo,
西泽夫元帅(新丰),
Win32.SHGFI_图标|
Win32.SHGFI_SMALLICON);
//使用此按钮可获得大图标
//hImgLarge=SHGetFileInfo(fName,0,
//参考shinfo(uint)元帅SizeOf(shinfo),
//Win32.SHGFI_图标(Win32.SHGFI_大图标);
//图标在shinfo的hIcon成员中返回
//结构
System.Drawing.Icon myIcon=System.Drawing.Icon.FromHandle(shinfo.hIcon);
imageList1.Images.Add(myIcon);
//将文件名和图标添加到listview
listView1.Items.Add(Path.GetFileName(System.IO.Path.GetFileNameWithoutExtension(fileName)),nIndex++);
//九倍++
}
抓住
{
}
}
}
私有无效列表视图1\u SelectedIndexChanged(对象发送方,事件参数e)
{
如果(listView1.SelectedIndices.Count=0)
{
textBox1.Text=listView1.Items[intselectedindex].Text;
}
}

选项1-作为一个选项,您可以使用计时器并使用
进程.GetProcesses()
或在
Win32\u进程上使用WMI查询来获取进程信息。然后根据进程ID将现有进程列表与新列表进行比较。然后,您可以查找进程和已删除的进程

选项2-作为另一个选项,您可以使用监视器检测新流程的启动和停止流程

您可以订阅监控对象的
ManagementEventWatcher
EventArrived
事件。在此事件中,您可以找到有关进程的信息,如
ProcessID
ProcessName

使用观察者和事件时,请记住:

  • 事件到达
    将在与UI线程不同的线程中引发,如果需要操作UI,则需要使用
    调用
  • 您应该停止监视程序并在
    OnFormClosed
    中处理它
  • 您应该添加对
    System.Management.dll
    的引用
  • 您应该使用System.Management添加
  • 您需要以管理员身份运行程序
示例

ManagementEventWatcher startWatcher;
ManagementEventWatcher stopWatcher;
protected override void OnLoad(EventArgs e)
{
    base.OnLoad(e);
    startWatcher = new ManagementEventWatcher("Select * From Win32_ProcessStartTrace");
    startWatcher.EventArrived += new EventArrivedEventHandler(startWatcher_EventArrived);
    stopWatcher = new ManagementEventWatcher("Select * From Win32_ProcessStopTrace");
    stopWatcher.EventArrived += new EventArrivedEventHandler(stopWatcher_EventArrived);
    startWatcher.Start();
    stopWatcher.Start();
}
void startWatcher_EventArrived(object sender, EventArrivedEventArgs e)
{
    MessageBox.Show(string.Format("{0} started", (string)e.NewEvent["ProcessName"]));
}
void stopWatcher_EventArrived(object sender, EventArrivedEventArgs e)
{
    MessageBox.Show(string.Format("{0} stopped", (string)e.NewEvent["ProcessName"]));
}
protected override void OnFormClosed(FormClosedEventArgs e)
{
    startWatcher.Stop();
    stopWatcher.Stop();
    startWatcher.Dispose();
    stopWatcher.Dispose();
    base.OnFormClosed(e);
}

我想你也希望移除那些不再存在的过程。哦,是的。很抱歉没有包括这个!UserControl中没有FormClosed。请在窗体上测试它,然后为自己自定义它。它很有效。但它需要管理员权限。有什么办法吗?没有,没有办法。您可以使用第一个选项。