Có cách nào để đăng ký sự kiện kích hoạt khi tệp thực thi của một tên tệp cụ thể bắt đầu không? Tôi biết thật dễ dàng để có được một sự kiện khi một quá trình thoát, bằng cách xử lý quy trình và đăng ký sự kiện đã thoát. Nhưng làm thế nào bạn có thể được thông báo khi một quá trình, mà không phải là đã chạy, bắt đầu ... mà không bỏ phiếu tất cả các tiến trình đang chạy?Sự kiện .NET cho quá trình thực thi Quy trình
Trả lời
Bạn có thể sử dụng như sau:
private ManagementEventWatcher WatchForProcessStart(string processName)
{
string queryString =
"SELECT TargetInstance" +
" FROM __InstanceCreationEvent " +
"WITHIN 10 " +
" WHERE TargetInstance ISA 'Win32_Process' " +
" AND TargetInstance.Name = '" + processName + "'";
// The dot in the scope means use the current machine
string scope = @"\\.\root\CIMV2";
// Create a watcher and listen for events
ManagementEventWatcher watcher = new ManagementEventWatcher(scope, queryString);
watcher.EventArrived += ProcessStarted;
watcher.Start();
return watcher;
}
private ManagementEventWatcher WatchForProcessEnd(string processName)
{
string queryString =
"SELECT TargetInstance" +
" FROM __InstanceDeletionEvent " +
"WITHIN 10 " +
" WHERE TargetInstance ISA 'Win32_Process' " +
" AND TargetInstance.Name = '" + processName + "'";
// The dot in the scope means use the current machine
string scope = @"\\.\root\CIMV2";
// Create a watcher and listen for events
ManagementEventWatcher watcher = new ManagementEventWatcher(scope, queryString);
watcher.EventArrived += ProcessEnded;
watcher.Start();
return watcher;
}
private void ProcessEnded(object sender, EventArrivedEventArgs e)
{
ManagementBaseObject targetInstance = (ManagementBaseObject) e.NewEvent.Properties["TargetInstance"].Value;
string processName = targetInstance.Properties["Name"].Value.ToString();
Console.WriteLine(String.Format("{0} process ended", processName));
}
private void ProcessStarted(object sender, EventArrivedEventArgs e)
{
ManagementBaseObject targetInstance = (ManagementBaseObject)e.NewEvent.Properties["TargetInstance"].Value;
string processName = targetInstance.Properties["Name"].Value.ToString();
Console.WriteLine(String.Format("{0} process started", processName));
}
Sau đó bạn sẽ gọi một trong hai WatchForProcessStart và/hoặc WatchForProcessEnd đi qua trong quá trình tên của bạn (ví dụ: "notepad.exe").
Đối tượng ManagementEventWatcher được trả về từ hai phương thức Watch * khi nó triển khai IDisposable và vì vậy bạn nên gọi Dispose trên các đối tượng này khi bạn đã kết thúc với chúng để ngăn sự cố.
Bạn cũng có thể thay đổi giá trị bỏ phiếu trong các truy vấn nếu bạn cần sự kiện được tăng lên nhanh hơn sau khi quá trình đã bắt đầu. Để thực hiện việc này, hãy thay đổi dòng "WITHIN 10" thành WITHIN ít hơn 10.
WMI có thể tạo sự kiện khi quy trình được tạo. Sau đó, bạn có thể lọc các sự kiện này.
Ví dụ sẽ đẹp :) –
@Adam: Tôi đã mong nhận xét đó. Thật không may, nó đã được một thời gian kể từ khi tôi làm việc với WMI sự kiện (năm), và không phải với NET vì vậy tôi sẽ phải tìm hiểu làm thế nào để làm điều đó bản thân mình ... và không có thời gian tại thời điểm này. – Richard
Đây là mã.
Lưu ý rằng bạn phải khởi động Visual Studio giống như Quản trị viên để thực thi mã này.
using System;
using System.Management;
namespace AppLaunchDetector
{
class Program
{
static void Main(string[] args)
{
ManagementEventWatcher w = null;
WqlEventQuery q;
try
{
q = new WqlEventQuery();
q.EventClassName = "Win32_ProcessStartTrace";
w = new ManagementEventWatcher(q);
w.EventArrived += new EventArrivedEventHandler(ProcessStartEventArrived);
w.Start();
Console.ReadLine(); // block main thread for test purposes
}
catch (Exception ex)
{
}
finally
{
w.Stop();
}
}
static void ProcessStartEventArrived(object sender, EventArrivedEventArgs e)
{
foreach (PropertyData pd in e.NewEvent.Properties)
{
Console.WriteLine("\n============================= =========");
Console.WriteLine("{0},{1},{2}", pd.Name, pd.Type, pd.Value);
}
}
}
}
- 1. Quá trình thực thi .NET đi qua
- 2. Lệnh thực thi in cho quy trình con Python. Mở
- 3. Sự kiện onSeek - Tuân thủ quy trình tìm kiếm
- 4. Làm thế nào để chờ quá trình chấm dứt thực hiện một quy trình khác trong tập tin thực thi
- 5. Trình giám sát quy trình .NET
- 6. Viết sự kiện cho trình xem sự kiện
- 7. Giao diện người dùng bão: Sự khác biệt giữa thời gian thực thi và quá trình
- 8. Thực thi song song các quy trình vỏ
- 9. Thực thi một quy trình con không thành công
- 10. Nhận tên quy trình hiện tại (thực thi) trong Go?
- 11. tuần tự thực thi các quy trình nền unix
- 12. Trình phát sự kiện liên tiến trình cho Node.js?
- 13. Chạy truy vấn trong quy trình sự kiện trong Access?
- 14. Trình phân tích cú pháp Java Java Jsoup: Thực thi các sự kiện javascript
- 15. Quá trình ngắt bằng CC .NET
- 16. Dòng lệnh không đợi cho đến khi quá trình thực thi exe kết thúc
- 17. Ngăn chặn việc thực thi đệ quy đệ quy?
- 18. C# viết cho trình xem sự kiện
- 19. sự kiện trình duyệt cho window.focus()
- 20. Matlab thực thi quá chậm
- 21. Thực thi quy trình từ bộ nhớ trong một tiến trình khác?
- 22. Bắt đầu quá trình phi cao từ quá trình cao
- 23. Nhận đường dẫn tuyệt đối để thực thi perl cho quy trình hiện tại
- 24. Sự khác biệt giữa quá trình giết và quy trình đóng là gì?
- 25. Làm cách nào để đồng bộ hóa quá trình thực hiện quy trình Phụ huynh/Con?
- 26. Eclipse: Bật Lưu thực thi chương trình
- 27. Sự kiện xây dựng bài đăng thực thi powershell
- 28. Sự cố với Quy trình đã Thoát
- 29. Cách thực hiện quy trình với CAP_SYS_RESOURCE
- 30. .net C#: Tạo một Quy trình Async
Mã này có thể được cấu trúc lại, nhưng tôi đã để nó tiết lộ để hy vọng có thể hiểu được – Clive
Bây giờ đó là câu trả lời! Cảm ơn! –
thực sự mã này có vẻ tốt. Nhưng nó không có tác dụng với tôi. Tôi đang thiếu bất kỳ điểm nào? win7, net 2.o dự án. – Yaya