首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >C#在新进程启动时引发事件

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

Stack Overflow用户
提问于 2011-02-06 02:55:32
回答 4查看 8.1K关注 0票数 12

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

EN

回答 4

Stack Overflow用户

发布于 2012-08-13 07:35:20

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

下面是一个示例查询,您可以使用它来跟踪流程启动:

代码语言:javascript
复制
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使用率为代价提供更快的响应。

票数 10
EN

Stack Overflow用户

发布于 2012-08-18 11:51:21

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

Audit process tracking

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

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

参考:.NET Process Monitor

票数 1
EN

Stack Overflow用户

发布于 2012-08-16 19:09:39

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

所以枚举窗口是更干净/更容易的选择。

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

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

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/4908906

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档