C#在新进程启动时引发事件

时间:2011-02-05 18:55:32

标签: c#

嘿,有没有办法在不使用ManagementEventWatcher而不使用Process.GetProcesses()的情况下启动新进程时引发事件? ManagementEventWatcher的问题在于用户需要具有高预制度。 谢谢!!!

4 个答案:

答案 0 :(得分:9)

与您当前使用的外部事件Win32_ProcessStartTrace不同,__InstanceCreationEvent__InstanceDeletionEvent WMI内部事件不需要管理员权限。

以下是可用于跟踪流程启动的示例查询:

SELECT TargetInstance 
  FROM __InstanceCreationEvent WITHIN 1 
 WHERE TargetInstance ISA 'Win32_Process' 
   AND TargetInstance.Name LIKE '<your process name.exe>'

更多信息:Process Information and Notifications using WMI

因为这些是内在事件,WMI最终通过轮询模仿事件行为,并且仅定期(此处,每1秒)检查新事件。将WITHIN持续时间减少到几分之一秒将使您以更快的速度响应CPU使用率。

答案 1 :(得分:1)

应该可以通过在Windows中配置审计进程跟踪来确定上次运行应用程序的时间。以下链接可以帮助您入门:

  

Audit process tracking

     

How can I track what programs come and go on my machine?

进程跟踪将在Windows事件日志中创建条目,然后您可以使用C#进行访问。

参考:.NET Process Monitor

答案 2 :(得分:0)

奇怪的是应用程序不需要在windows中创建窗口。创建进程可能不属于您使用的窗口站。无论如何,您将需要找到该过程的窗口,并且还需要检测所有过程的新窗口和关闭窗口。

因此,枚举窗口更清晰/更容易选择。

在桌面句柄上尝试EnumChildWindows函数(由GetDesktopWindow检索)以查找应用程序的顶级窗口。在获取的句柄上使用GetWindowThreadProcessIdEnumThreadWindows来检测窗口的子窗口。

低优先级线程将完成这项工作。

答案 3 :(得分:0)

您可以使用user32.dll中的EnumDesktopWindows,您将获得所有窗口句柄,您可以使用GetWindowText检查窗口的标题,以及使用GetClassName的窗口类型。

这样你可以隐藏任何地方的提示或财富。 (因为你将获得所有窗口(和控件)的句柄)。

查看此课程是否对您有用 Managed Global Hook for Window Creation and Destruction

在那篇文章中,有人创建了一个易于附加事件的好类,你可以在不提升权限的情况下运行该代码。

获得窗口(控件)手柄后,您可以在其上添加文字或绘制图像以获取提示。