2011-02-05 92 views
11

嘿那里,有没有一种方法可以在不使用ManagementEventWatcher的情况下启动新进程时引发事件,也不需要使用Process.GetProcesses()? ManagementEventWatcher的问题在于用户需要具有高预检。 谢谢!!!C#在新进程启动时引发一个事件

+3

而不是试图规避安全模型,如何告诉我们你实际上试图解决什么问题?可能有更好的整体方法,你没有想到。 – 2011-02-05 18:59:28

+0

我正在创建一个使用操作系统窗口的游戏(Treasure Hunt),因此,当我打开一个新的记事本或计算器时,我将向该进程发送提示..所以我需要在下一个进程启动时引发事件,所以我可以发送宝藏的提示....我希望你得到它.... – user604627 2011-02-05 19:06:51

+0

你尝试过`ManagementEventWatcher`吗?我没有在文档中看到任何需要高权限的文档,但我承认我没有在非常有限的用户帐户上尝试过。 – 2011-02-05 19:24:58

回答

9

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

这里是你可以用它来追踪过程开始的样本查询:

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

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

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

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

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

0

你或许可以使用EnumDesktopWindows从user32.dll中,你会得到所有的窗口句柄,您可以检查使用GetWindowText函数窗口的标题,以及API使用GetClassName API类型的窗口。

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

看看这个类将是你 Managed Global Hook for Window Creation and Destruction

在这篇文章中,有人创造了很好的类容易附着事件有用,您可以运行代码,而无需提升权限。

一旦你得到窗口(控制)句柄,你可以添加文字或绘制图像的提示。

相关问题