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

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

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

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

 SELECT TargetInstance FROM __InstanceCreationEvent WITHIN 1 WHERE TargetInstance ISA 'Win32_Process' AND TargetInstance.Name LIKE '' 

更多信息: 使用WMI的流程信息和通知

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

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

审计流程跟踪

如何跟踪我的机器上的程序进出?

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

参考: .NET Process Monitor

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

所以枚举窗口是更清洁/更容易的选择。

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

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

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

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

查看此类对于窗口创建和销毁的托管全局钩子是否有用

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

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