【问题标题】:C# Raise an event when a new process startsC# 在新进程启动时引发事件
【发布时间】:2011-06-21 23:43:48
【问题描述】:

嘿,有没有办法在不使用 ManagementEventWatcher 和不使用 Process.GetProcesses() 的情况下启动新进程时引发事件? ManagementEventWatcher 的问题是用户需要有很高的权限。 谢谢!!!

【问题讨论】:

  • 与其试图规避安全模型,不如告诉我们您真正想要解决的问题是什么?可能有一个您没有想到的更好的整体方法。
  • 我正在创建一个在操场上使用 windows 的游戏(寻宝),所以当我打开一个新的记事本或计算器时,我会向该过程发送提示......所以我需要在下一个过程开始了,所以我可以发送宝藏的提示......我希望你能得到它......
  • 你试过ManagementEventWatcher吗?我在文档中没有看到任何说它需要高权限的内容,尽管我承认我没有在非常受限的用户帐户上尝试过。
  • 是的,我试过了:startWatch = new ManagementEventWatcher(new WqlEventQuery("SELECT * FROM Win32_ProcessStartTrace")); startWatch.EventArrived += new EventArrivedEventHandler(startWatch_EventArrived); startWatch.Start();在 startWatch.Start() 之后;行抛出异常[访问被拒绝],但是当我以管理员身份打开时一切都很好
  • 游戏自己启动进程吗?

标签: c#


【解决方案1】:

与您当前使用的外部事件 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 使用率。

【讨论】:

  • 您应该注意,非常短的轮询间隔(例如 0.1 秒)可能会占用多达 30% 的 CPU,而不是您的进程,而是执行实际轮询的 WmiPrvSE.exe。以防万一您想知道为什么不是您的进程突然占用了这么多 CPU 而是一个系统进程。
【解决方案2】:

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

Audit process tracking

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

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

参考:.NET Process Monitor

【讨论】:

  • 这是有道理的,然后我可以订阅事件日志更新而无需轮询...msdn.microsoft.com/en-us/library/bb671202(v=vs.90).aspx。我想我会把赏金奖励给你。
  • 请注意,虽然最初的问题是由不同的提问者提出的,所以我无法将您的答案标记为已接受。
  • 这不是stackoverflow.com/questions/1986249/…的逐字复制吗?为此获得赏金是否正常?赏金不应该属于0xA3吗??
  • @7heo.tk 这是很久以前的事了,我已经在源代码中添加了参考,不幸的是你不能关闭活动的赏金作为重复项。
【解决方案3】:

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

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

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

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

【讨论】:

    【解决方案4】:

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

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

    看看这门课是否对你有用 Managed Global Hook for Window Creation and Destruction

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-11-21
      • 1970-01-01
      • 1970-01-01
      • 2017-01-30
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多