2009-02-04 8 views
9

Chúng tôi đang cố gắng phát triển một ứng dụng nhỏ có thể giám sát các chương trình/quy trình đang thực hiện trong máy tính Windows.Làm thế nào để giám sát quá trình thực hiện chương trình/trong cửa sổ?

Nếu chương trình/quy trình không được chạy, nó sẽ bị chặn. Nó hoạt động tương tự như một antivirus.

Đây là ý tưởng cơ bản.

Tôi muốn biết cách móc vào hệ điều hành để nhận thông báo về mọi chương trình/quy trình cố gắng chạy trong máy.

Trả lời

9

Cách đơn giản nhất là sử dụng WMI. Cụ thể theo dõi Win32_ProcessStartTrace. Điều này là tốt hơn so với Win32_Process, bởi vì nó được thiết lập để sử dụng các sự kiện trong khi Win32_Process yêu cầu bỏ phiếu mà là nhiều CPU chuyên sâu. Dưới đây là cách thực hiện trong C#. Trước tiên, hãy đảm bảo rằng System.Management được thiết lập làm tham chiếu cho dự án của bạn.

public System.Management.ManagementEventWatcher mgmtWtch; 

    public Form1() 
    { 
     InitializeComponent(); 
     mgmtWtch = new System.Management.ManagementEventWatcher("Select * From Win32_ProcessStartTrace"); 
     mgmtWtch.EventArrived += new System.Management.EventArrivedEventHandler(mgmtWtch_EventArrived); 
     mgmtWtch.Start(); 
    } 

    void mgmtWtch_EventArrived(object sender, System.Management.EventArrivedEventArgs e) 
    { 
     MessageBox.Show((string)e.NewEvent["ProcessName"]); 
    } 

    private void Form1_FormClosing(object sender, FormClosingEventArgs e) 
    { 
     mgmtWtch.Stop(); 
    } 

Mã sẽ tạo hộp thư mỗi lần bạn khởi chạy quy trình mới. Từ đó bạn có thể kiểm tra danh sách trắng/danh sách cấm và hành động phù hợp.

+1

Thật không may WMI dường như gửi thông báo đến 5 giây sau khi quá trình được tạo. Không hữu ích cho các thông báo thời gian thực hoặc làm bất cứ điều gì với các tác vụ ngắn ngủi. –

+1

Tôi đã tìm thấy một ví dụ trên trang web của Microsoft cho cùng một tác vụ [ở đây] (http://msdn.microsoft.com/en-us/library/system.management.managementeventwatcher.waitfornextevent.aspx?cs-save-lang=1&cs- lang = csharp # code-snippet-1), nhưng nó có cùng một vấn đề. –

+0

Gah ... bằng cách sử dụng WMI có nhiều CPU hơn việc bỏ phiếu danh sách quy trình thủ công (nó chỉ xảy ra trong quy trình dịch vụ WMI thay vì quy trình của bạn). Hơn nữa, nếu ứng dụng của bạn gặp sự cố, đăng ký sẽ tiếp tục chạy trong dịch vụ WMI, hút CPU ... –

0

Tôi không cố gắng nhận thông báo thời gian thực. Làm thế nào bao giờ hết, đây là cách để có được tiến trình đang chạy trong C#

using System.Diagnostics; 

//Somewhere in your method 

Process[] runningList = Process.GetProcesses(); 

foreach(Process p in runningList){ 
Console.WriteLine("Process: {0} ID: {1}", p.ProcessName, p.Id); 
} 

Quý vị cũng có thể sử dụng các đạo cụ sau đây của một quá trình

  • StartTime - Hiển thị thời gian quá trình này bắt đầu
  • TotalProcessorTime - Hiển thị lượng thời gian CPU quá trình đã thực hiện
  • Chủ đề - cấp quyền truy cập vào tập hợp các chủ đề trong quá trình
0

Tôi sẽ kiểm tra Win32-api SetWindowsHookEx với hằng số WH_GETMESSAGE để thêm một cuộc gọi lại vào chương trình của bạn khi một cửa sổ mới đang được tạo.

http://pinvoke.net/default.aspx/user32.SetWindowsHookEx

Google API và WH_GETMESSAGE để tìm hiểu thêm.

Ngoài ra kiểm tra các bài báo/code librarys sau: http://www.vbaccelerator.com/home/Vb/Code/Libraries/Hooks/vbAccelerator_Hook_Library/article.asp

http://www.codeproject.com/KB/DLL/hooks.aspx?fid=2061&df=90&mpp=25&noise=3&sort=Position&view=Quick&fr=76&select=726975