2009-08-14 48 views
8

ai đó có thể cho tôi biết làm thế nào tôi có thể nắm bắt một quy trình đang chạy trong C# bằng cách sử dụng lớp xử lý nếu tôi đã biết xử lý?Nhận quy trình đang chạy xử lý được xử lý

Id thay vì không phải liệt kê phương thức xử lý getrunning. pInvoke là ok nếu có thể.

Trả lời

8

Trong đồng bằng C#, có vẻ như bạn phải lặp qua tất cả:

// IntPtr myHandle = ... 
Process myProcess = Process.GetProcesses().Single(
    p => p.Id != 0 && p.Handle == myHandle); 

Ví dụ trên cố ý không nếu xử lý không được tìm thấy. Nếu không, tất nhiên bạn có thể sử dụng SingleOrDefault. Rõ ràng, nó không giống như bạn yêu cầu xử lý của quá trình ID 0, do đó các điều kiện bổ sung.

Sử dụng WINAPI, bạn có thể sử dụng GetProcessId. Tôi không thể tìm thấy nó trên pinvoke.net, nhưng điều này nên làm:

[DllImport("kernel32.dll")] 
static extern int GetProcessId(IntPtr handle); 

(chữ ký sử dụng một DWORD, nhưng quá trình ID được đại diện bởi int s trong NET BCL)

Có vẻ như một bit lẻ mà bạn có một xử lý, nhưng không phải là một quá trình ID tuy nhiên. Xử lý quy trình được mua lại bằng cách gọi số OpenProcess, có ID tiến trình.

+0

tôi nhận được thông báo từ chối truy cập (ngoại lệ win32)? – Grant

+0

Đã sửa lỗi, nhưng có lẽ bạn nên sử dụng WINAPI thay thế. Đó là những gì bạn thích ở nơi đầu tiên :) – Thorarin

+1

process.handle cấp quyền truy cập bị từ chối nhưng. ** process.MainWindowHandle ** chạy lỗi miễn phí –

3
using System.Diagnostics; 

class ProcessHandler { 
    public static Process FindProcess(IntPtr yourHandle) { 
     foreach (Process p in Process.GetProcesses()) { 
      if (p.Handle == yourHandle) { 
       return p; 
      } 
     } 

     return null; 
    } 
} 
2

Có vẻ như không có cách đơn giản để thực hiện việc này bằng API .Net. Câu hỏi đặt ra là, nơi bạn đã nhận được xử lý đó từ đâu? Nếu bằng cách giống như cách bạn có thể nhận được quyền truy cập vào các quá trình ID, bạn có thể sử dụng:

Process.GetProcessById (int iD)

+0

Bắt nó bằng ID chắc chắn sẽ tốt hơn/dễ dàng hơn, nhưng nó có thể bằng cách xử lý. Xem các câu trả lời khác. – Thorarin

+0

một API cho thấy HWND nhưng không phải là ID – Grant

+0

Câu hỏi vẫn còn, nơi xử lý đến từ đó. Nếu một API win32 được sử dụng, có thể một cuộc gọi API khác sẽ được cấp để lấy ID tiến trình từ tay cầm. Một vấn đề khác là, xử lý chỉ hợp lệ trong cùng một quá trình, ID là hệ thống rộng –

1

Bạn có thể sử dụng GetWindowThreadProcessId WinAPI gọi

http://www.pinvoke.net/default.aspx/user32/GetWindowThreadProcessId.html

Để có được Id Process - sau đó nhận đối tượng Quy trình bằng cách sử dụng .....

Nhưng tại sao bạn không muốn liệt kê id của các quy trình đang chạy?

+0

Cái đó có tay cầm cửa sổ. Anh ta có một quy trình xử lý. WINAPI 'GetProcessId' là những gì anh ta cần. – Thorarin

Các vấn đề liên quan