2009-08-14 12 views
8

क्या कोई मुझे बता सकता है कि मैं प्रक्रिया वर्ग का उपयोग कर सी # में चल रही प्रक्रिया को कैप्चर कर सकता हूं यदि मुझे पहले से ही हैंडल पता है?चल रहे प्रक्रिया को संभाल लें

आईडी बल्कि ग़लत प्रक्रिया प्रक्रियाओं को गिनने की आवश्यकता नहीं है। यदि संभव हो तो pInvoke ठीक है।

उत्तर

8

सादा सी # में, यह है कि आप उन सब के माध्यम से लूप करने के लिए है दिखता है:

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

ऊपर के उदाहरण जानबूझकर विफल रहता है संभाल नहीं पाया जाता है। अन्यथा, आप निश्चित रूप से SingleOrDefault का उपयोग कर सकते हैं। जाहिर है, यह आपको पसंद नहीं है कि आप प्रक्रिया आईडी 0 के हैंडल का अनुरोध करते हैं, इसलिए अतिरिक्त स्थिति।

WINAPI का उपयोग करके, आप GetProcessId का उपयोग कर सकते हैं। मैं इसे pinvoke.net पर नहीं मिल सकता है, लेकिन यह करना चाहिए:

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

(हस्ताक्षर एक DWORD का उपयोग करता है, लेकिन इस प्रक्रिया आईडी नेट बीसीएल में int रों का प्रतिनिधित्व कर रहे)

यह एक लगता है थोड़ा विचित्र है कि आपके पास एक हैंडल होगा, लेकिन प्रक्रिया आईडी नहीं है। प्रक्रिया हैंडल OpenProcess पर कॉल करके अधिग्रहण की जाती है, जो एक प्रक्रिया आईडी लेती है।

+0

मुझे एक एक्सेस अस्वीकृत संदेश (win32 अपवाद) मिलता है? – Grant

+0

फिक्स्ड, लेकिन शायद आपको इसके बजाय WINAPI का उपयोग करना चाहिए। यही वह जगह है जिसे आपने पहली जगह पसंद किया :) – Thorarin

+1

process.handle पहुंच से इनकार कर दिया गया है लेकिन। ** प्रक्रिया। मेनविंडोहैंडल ** त्रुटि मुक्त करता है –

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

.NET API द्वारा ऐसा करने का कोई आसान तरीका नहीं लगता है। सवाल यह है कि, आपको वह संभाल कहाँ से मिला? उसी तरह से आप के लिए प्रक्रियाओं आईडी का उपयोग कर सकते हैं, तो आप इस्तेमाल कर सकते हैं:

Process.GetProcessById (int iD)

+0

आईडी द्वारा इसे प्राप्त करना निश्चित रूप से बेहतर/आसान होगा, लेकिन यह संभालकर संभव है। अन्य उत्तरों देखें। – Thorarin

+0

एक एपीआई एचडब्ल्यूएनडी का खुलासा करता है लेकिन आईडी – Grant

+0

आईडी नहीं है, जहां हैंडल आता है। यदि एक win32 एपीआई का उपयोग किया जाता है, तो हैंडल से प्रक्रिया आईडी प्राप्त करने के लिए शायद एक और एपीआई कॉल जारी किया जाना चाहिए। एक और मुद्दा यह है कि हैंडल केवल एक ही प्रक्रिया के भीतर मान्य हैं, आईडी सिस्टम विस्तृत हैं –

1

आप GetWindowThreadProcessId WinAPI कॉल

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

इस्तेमाल कर सकते हैं प्रक्रिया आईडी प्राप्त करने के लिए - तो उस प्रक्रिया का उपयोग कर प्रक्रिया ऑब्जेक्ट प्राप्त करें .....

लेकिन आप चल रही प्रक्रियाओं के आईडी को क्यों नहीं समझना चाहते हैं?

+0

वह एक विंडो हैंडल लेता है। उसके पास एक प्रक्रिया संभाल है। WINAPI 'GetProcessId' वह है जो उसे चाहिए। – Thorarin

संबंधित मुद्दे