我目前正在编写一个对后台运行的程序敏感的winforms应用程序。目前我有一个线程检查每一秒如果我感兴趣的进程已经开始/仍在运行,但我确信如果我可以使用一个事件来告诉我用户何时打开会更容易/关闭了申请。请注意,我没有在程序中手动启动该过程;用户可以完全控制它。查看流程文档,我什么都看不到。有没有办法搞定这个?
答案 0 :(得分:6)
您还可以使用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 以获取详细信息。
答案 1 :(得分:3)
嗯,至少应该可以在CreateProcess
WinAPI方法上创建一个钩子。您甚至可以使用它来阻止进程启动(如果您不希望进程启动,只需返回false
)。当然,你必须在每个可以启动新进程的方法上做一个钩子,但并不是那么多。
正如Purrformance建议的那样,http://easyhook.codeplex.com/是一个很容易从.NET创建钩子的库。