C# 如何检测新进程是否在计时器c上运行#
我如何确定一个新进程是否正在运行(不是特定的,只是任何一个新进程),并使用计时器中的图标将其添加到listView 目前我有这个,它所做的就是重置listview,不管是否有新进程。我希望它不要重置listview,而是将新的listview添加到listview中。同样,删除不再存在的进程C# 如何检测新进程是否在计时器c上运行#,c#,winforms,process,C#,Winforms,Process,我如何确定一个新进程是否正在运行(不是特定的,只是任何一个新进程),并使用计时器中的图标将其添加到listView 目前我有这个,它所做的就是重置listview,不管是否有新进程。我希望它不要重置listview,而是将新的listview添加到listview中。同样,删除不再存在的进程 public UserControl5() { InitializeComponent(); } [StructLayout(Lay
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。请在窗体上测试它,然后为自己自定义它。它很有效。但它需要管理员权限。有什么办法吗?没有,没有办法。您可以使用第一个选项。