2009-06-09 27 views
17

Tôi có một số dịch vụ mà một ứng dụng cần chạy để một số tính năng của ứng dụng hoạt động. Tôi muốn kích hoạt tùy chọn để chỉ bắt đầu các dịch vụ Windows bên ngoài để khởi tạo sau khi ứng dụng được khởi chạy. (trái với việc chúng bắt đầu tự động với máy và mất bộ nhớ khi ứng dụng không cần thiết)Giám sát khi một exe được khởi chạy

Tôi không có quyền truy cập vào mã của exe để thực hiện điều này, vì vậy lý tưởng tôi muốn viết C# .Net Dịch vụ Windows sẽ giám sát khi một exe được khởi động.

Điều tôi đã tìm thấy cho đến nay là System.IO.FileSystemEventHandler. Thành phần này chỉ xử lý các loại sự kiện đã thay đổi, tạo, xóa và đổi tên. Tôi không nghĩ rằng một thành phần hệ thống tập tin sẽ là nơi lý tưởng để tìm thấy những gì tôi đang tìm kiếm, nhưng không biết đi đâu khác.

Có thể tôi không tìm kiếm bằng từ khóa phù hợp, nhưng tôi chưa tìm thấy bất kỳ thứ gì cực kỳ hữu ích trên Google hoặc tại đây trên stackoverflow.com.

Giải pháp sẽ được yêu cầu chạy trên XP, Vista và Win 7 khi nó đến ...

Cảm ơn trước cho bất kỳ con trỏ nào.

Trả lời

26

Từ this article, bạn có thể sử dụng WMI (không gian tên System.Management) trong dịch vụ của mình để xem các sự kiện bắt đầu quy trình.

void WaitForProcess() 
{ 
    ManagementEventWatcher startWatch = new ManagementEventWatcher(
     new WqlEventQuery("SELECT * FROM Win32_ProcessStartTrace")); 
    startWatch.EventArrived 
         += new EventArrivedEventHandler(startWatch_EventArrived); 
    startWatch.Start(); 

    ManagementEventWatcher stopWatch = new ManagementEventWatcher(
     new WqlEventQuery("SELECT * FROM Win32_ProcessStopTrace")); 
    stopWatch.EventArrived 
         += new EventArrivedEventHandler(stopWatch_EventArrived); 
    stopWatch.Start(); 
} 

    static void stopWatch_EventArrived(object sender, EventArrivedEventArgs e) { 
    stopWatch.Stop(); 
    Console.WriteLine("Process stopped: {0}" 
         , e.NewEvent.Properties["ProcessName"].Value); 
    } 

    static void startWatch_EventArrived(object sender, EventArrivedEventArgs e) { 
    startWatch.Stop(); 
    Console.WriteLine("Process started: {0}" 
         , e.NewEvent.Properties["ProcessName"].Value); 
    } 
} 

WMI cho phép truy vấn khá phức tạp; bạn có thể sửa đổi các truy vấn tại đây để chỉ kích hoạt trình xử lý sự kiện khi ứng dụng đã xem của bạn khởi chạy hoặc trên các tiêu chí khác. Here's a quick introduction, từ góc độ C#.

+0

Câu trả lời hay. giải quyết vấn đề của tôi. – Stimul8d

+0

Tuyệt vời, rất hữu ích. Chúc mừng! – tjjjohnson

+1

Có một số sự cố khi thực thi mã này trên windows 7. Tôi gặp phải lỗi "truy cập bị từ chối" khi gọi hàm startWatch.Start(). Có ai tìm thấy một workaroun cho điều đó? – tjjjohnson

4

bạn có 3 lựa chọn ở đây:

Các đáng tin cậy/xâm nhập một, thiết lập một cái móc trong mã không được quản lý mà giao lại ứng dụng C# của bạn bất cứ khi nào một ứng dụng được khởi chạy. Điều này là khó khăn để có được quyền và liên quan đến việc tải thêm một DLL với mỗi quá trình. (Hoặc bạn có thể thiết lập trình điều khiển, thậm chí còn khó khăn hơn để viết)

Cách ít tin cậy hơn, liệt kê tất cả các quy trình (sử dụng lớp System.Diagnostics.Process) một cách thường xuyên (cứ 10-30 giây) để xem ứng dụng được khởi chạy.

Cũng có thể xem sự kiện WMI Win32_Process, InstanceCreationEvent từ mã được quản lý. Bạn không chắc chắn nó đáng tin cậy như thế nào, nhưng tôi nghi ngờ nó sẽ tốt hơn so với quá trình bỏ phiếu.

0

Giám sát nếu quá trình đang chạy - một dịch vụ phải đang chạy để thực hiện việc này.

Nếu bạn thực sự không muốn tiêu thụ bất kỳ tài nguyên nào - hãy viết một dịch vụ đơn giản trong C. Ứng dụng dịch vụ được viết mà không có MFC/ATL có thể tiêu thụ tới 300-400 kb bộ nhớ và không có chu trình CPU. Khi quá trình bạn quan tâm bắt đầu, bạn có thể sinh ra các dịch vụ C# của bạn.

0
public Process IsProcessOpen(string name) 
     { 
      foreach (Process clsProcess in Process.GetProcesses()) 
       if (clsProcess.ProcessName.Contains(name)) 
        return clsProcess; 
      return null; 
     } 
0

Trả lời khía cạnh Windows 7 của nó không hoạt động. Nếu bạn đang theo dõi quá trình 64 bit, quá trình của bạn cần được xây dựng để hoạt động trong không gian địa chỉ 64bit.