我目前正在編寫一個Winforms應用程序,它對在後臺運行的程序很敏感。目前我有一個線程每秒檢查一次,如果我感興趣的進程已經開始/仍在運行,但是我確信如果我可以使用一個事件告訴我用戶何時打開/關閉應用程序。請注意,我沒有在程序中手動啓動該過程;用戶有完全的控制權。通過流程文檔查看我什麼也沒看到。有沒有什麼辦法可以融入這個?有沒有辦法將事件處理程序附加到C#中正在運行的進程列表?
6
A
回答
4
您還可以使用WMI活動來跟蹤這一點。
下面是一個例子:
static void Main(string[] args)
{
var query = new EventQuery("SELECT * FROM __InstanceCreationEvent WITHIN 1 WHERE TargetInstance isa \"Win32_Process\"");
using (var eventWatcher = new ManagementEventWatcher(query))
{
eventWatcher.EventArrived += eventWatcher_EventArrived;
eventWatcher.Start();
Console.WriteLine("Started");
Console.ReadLine();
eventWatcher.EventArrived -= eventWatcher_EventArrived;
eventWatcher.Stop();
}
}
static void eventWatcher_EventArrived(object sender, EventArrivedEventArgs e)
{
try
{
var instanceDescription = e.NewEvent.GetPropertyValue("TargetInstance") as ManagementBaseObject;
if(instanceDescription!=null)
{
var executablePath = instanceDescription.GetPropertyValue("ExecutablePath");
if(executablePath!=null)
{
Console.WriteLine("Application {0} started", executablePath.ToString());
}
}
}
catch (ManagementException) { }
}
有很多過程的屬性可被接收的。如優先級,說明,命令行參數等。有關詳細信息,請參閱instanceDescription.Properties。
+0
這非常方便,漂亮和乾淨。它不應該像我的解決方案那樣減緩新流程的開始(如果鉤子太慢)。 – Luaan
2
那麼,至少應該可以在WinAPI方法上創建鉤子。你甚至可以用它來阻止進程啓動(如果你不想讓進程啓動,只需返回false
)。當然,你必須勾畫出每一種可以啓動一個新流程的方法,但並不是那麼多。
由於Purrformance建議,http://easyhook.codeplex.com/是從.NET輕鬆創建鉤子的好方法。
+2
我打算回答類似的問題,但既然你做了,那麼這裏有一個+1。此外,它遷徙是值得一提的[EasyHook](http://easyhook.codeplex.com/) –
相關問題
- 1. 將事件處理程序附加到存儲在列表中的事件
- 2. 如何確保沒有處理程序附加到事件?
- 3. 在VS2008中,有沒有辦法自動「附加到進程」?
- 4. 有沒有辦法將事件處理函數附加到mysql錯誤?
- 5. 有沒有辦法將事件處理程序附加到抽屜打開和關閉?
- 6. 無法將事件處理程序附加到我的控件?
- 7. 有沒有辦法刷新正在運行的進程
- 8. 元素沒有附加類時的事件處理程序
- 9. 有沒有辦法快速添加處理程序到Yesod?
- 10. 附加到事件處理程序
- 11. 在現有處理程序之前附加我的事件處理程序
- 12. 有沒有辦法在運行時將類文件加載到程序集?
- 13. 在Android事件處理程序中使用'this'。有沒有更好的辦法?
- 14. 將事件處理程序附加到節點語法
- 15. 將事件處理程序附加到Com事件:InvalidOperationException(S7-PLCSIM)
- 16. 將事件處理程序附加到事件OnInit或OnLoad上
- 17. 有沒有辦法將事件處理程序綁定到正在移動的Tkinter窗口?
- 18. 如何將事件處理程序附加到SharePoint中的特定列表?
- 19. 附加的事件處理程序
- 20. 有沒有辦法在運行時將佈局添加到Android應用程序?
- 21. 將附加信息傳遞到事件處理程序中
- 22. 更改已附加事件處理程序運行時
- 23. Linkbutton單擊事件沒有運行處理程序
- 24. 有沒有辦法在concurrent.futures中停止正在運行的進程?
- 25. 有沒有辦法在子進程中運行節點任務?
- 26. 批處理程序在Windows 7中沒有正確運行
- 27. 有沒有辦法告訴哪個JavaScript文件包含事件處理程序?
- 28. jQuery:使用$ .delegate附加函數附加到現有事件處理程序
- 29. 實時附加事件處理程序
- 30. 將多個事件的JQuery委託附加到處理程序
你可能會發現這裏的答案也有用:http://stackoverflow.com/questions/1916141/can-i-get-notified-when-some-process-starts – Baldrick
可能重複的[.NET進程監視器]( http://stackoverflow.com/questions/1986249/net-process-monitor) –