我目前正在编写一个Winforms应用程序,它对在后台运行的程序很敏感。目前我有一个线程每秒检查一次,如果我感兴趣的进程已经开始/仍在运行,但是我确信如果我可以使用一个事件告诉我用户何时打开/关闭应用程序。请注意,我没有在程序中手动启动该过程;用户有完全的控制权。通过流程文档查看我什么也没看到。有没有什么办法可以融入这个?有没有办法将事件处理程序附加到C#中正在运行的进程列表?
6
A
回答
4
您还可以使用WMI活动来跟踪这一点。
下面是一个例子:
static void Main(string[] args)
{
var query = new EventQuery("SELECT * FROM __InstanceCreationEvent WITHIN 1 WHERE TargetInstance isa \"Win32_Process\"");
using (var eventWatcher = new ManagementEventWatcher(query))
{
eventWatcher.EventArrived += eventWatcher_EventArrived;
eventWatcher.Start();
Console.WriteLine("Started");
Console.ReadLine();
eventWatcher.EventArrived -= eventWatcher_EventArrived;
eventWatcher.Stop();
}
}
static void eventWatcher_EventArrived(object sender, EventArrivedEventArgs e)
{
try
{
var instanceDescription = e.NewEvent.GetPropertyValue("TargetInstance") as ManagementBaseObject;
if(instanceDescription!=null)
{
var executablePath = instanceDescription.GetPropertyValue("ExecutablePath");
if(executablePath!=null)
{
Console.WriteLine("Application {0} started", executablePath.ToString());
}
}
}
catch (ManagementException) { }
}
有很多过程的属性可被接收的。如优先级,说明,命令行参数等。有关详细信息,请参阅instanceDescription.Properties。
+0
这非常方便,漂亮和干净。它不应该像我的解决方案那样减缓新流程的开始(如果钩子太慢)。 – Luaan
2
那么,至少应该可以在WinAPI方法上创建钩子。你甚至可以用它来阻止进程启动(如果你不想让进程启动,只需返回false
)。当然,你必须勾画出每一种可以启动一个新流程的方法,但并不是那么多。
由于Purrformance建议,http://easyhook.codeplex.com/是从.NET轻松创建钩子的好方法。
+2
我打算回答类似的问题,但既然你做了,那么这里有一个+1。此外,它迁徙是值得一提的[EasyHook](http://easyhook.codeplex.com/) –
相关问题
- 1. 将事件处理程序附加到存储在列表中的事件
- 2. 如何确保没有处理程序附加到事件?
- 3. 在VS2008中,有没有办法自动“附加到进程”?
- 4. 有没有办法将事件处理函数附加到mysql错误?
- 5. 有没有办法将事件处理程序附加到抽屉打开和关闭?
- 6. 无法将事件处理程序附加到我的控件?
- 7. 有没有办法刷新正在运行的进程
- 8. 元素没有附加类时的事件处理程序
- 9. 有没有办法快速添加处理程序到Yesod?
- 10. 附加到事件处理程序
- 11. 在现有处理程序之前附加我的事件处理程序
- 12. 有没有办法在运行时将类文件加载到程序集?
- 13. 在Android事件处理程序中使用'this'。有没有更好的办法?
- 14. 将事件处理程序附加到节点语法
- 15. 将事件处理程序附加到Com事件:InvalidOperationException(S7-PLCSIM)
- 16. 将事件处理程序附加到事件OnInit或OnLoad上
- 17. 有没有办法将事件处理程序绑定到正在移动的Tkinter窗口?
- 18. 如何将事件处理程序附加到SharePoint中的特定列表?
- 19. 附加的事件处理程序
- 20. 有没有办法在运行时将布局添加到Android应用程序?
- 21. 将附加信息传递到事件处理程序中
- 22. 更改已附加事件处理程序运行时
- 23. Linkbutton单击事件没有运行处理程序
- 24. 有没有办法在concurrent.futures中停止正在运行的进程?
- 25. 有没有办法在子进程中运行节点任务?
- 26. 批处理程序在Windows 7中没有正确运行
- 27. 有没有办法告诉哪个JavaScript文件包含事件处理程序?
- 28. jQuery:使用$ .delegate附加函数附加到现有事件处理程序
- 29. 实时附加事件处理程序
- 30. 将多个事件的JQuery委托附加到处理程序
你可能会发现这里的答案也有用:http://stackoverflow.com/questions/1916141/can-i-get-notified-when-some-process-starts – Baldrick
可能重复的[.NET进程监视器]( http://stackoverflow.com/questions/1986249/net-process-monitor) –