2010-01-13 10 views
32

मैं कई प्रक्रियाओं को समाप्त करना चाहता हूं, लेकिन मैं प्रत्येक प्रक्रिया को अपना डेटा सहेजने का मौका देना चाहता हूं, उपयोगकर्ता को फ़ाइल सहेजने और यहां तक ​​कि निकट अनुरोध को अनदेखा करने के बारे में पूछना चाहता हूं।प्रक्रिया को गहन तरीके से समाप्त कैसे करें?

तो TerminateProcess सवाल से बाहर है, क्योंकि यह तुरंत प्रक्रिया को मारता है। एक और तरीका SendMessage/PostMessage का उपयोग मुख्य विंडो में WM_CLOSE भेजने के लिए होगा, दुर्भाग्य से मुझे प्रक्रियाओं की खिड़कियों के बारे में कुछ भी पता नहीं है, मेरे पास केवल प्रक्रिया आईडी है, इसलिए FindWindow या तो मदद नहीं करता है। क्या प्रक्रिया की मुख्य खिड़कियां खोजने का कोई और तरीका है?

दूसरे शब्दों में: वहाँ शान से बस कार्य प्रबंधक की तरह किसी भी प्रक्रिया समाप्त करने के लिए है कि आप पर "समाप्ति टास्क" पर क्लिक करें जब कोई तरीका है? (और "अंत प्रक्रिया" नहीं)

+0

मुझे लगता है कि "कार्य" शीर्ष स्तर (दृश्यमान) खिड़कियां हैं। इसलिए, 'WM_CLOSE' को समाप्त कार्य पर (शायद) भेजा जाएगा। –

+0

यदि आप एक सॉफ्टवेयर डेवलपर नहीं हैं - बस एक विंडोज उपयोगकर्ता - देखें [संबंधित सुपर उपयोगकर्ता प्रश्न कैसे चलने वाले एप्लिकेशन को समाप्त करने के लिए सावधानीपूर्वक पूछना है] (http://superuser.com/questions/959364/on-windows- कैसे-कर सकते हैं-ए-शान से-पूछना एक प्रक्रिया करने के लिए समाप्त)। – unforgettableid

+0

ध्यान दें कि, विंडोज 8.1 के रूप में, टास्क मैनेजर का "एंड टास्क" बटन अब जबरन चुने हुए एप्लिकेशन को समाप्त कर देता है और आपको किसी भी सहेजे गए काम को खोने का कारण बनता है।इसे प्रतिबिंबित करने के लिए आप अपना प्रश्न संपादित करना चाहेंगे। – unforgettableid

उत्तर

22

EnumWindows किसी प्रक्रिया में सभी शीर्ष स्तर की विंडो को दर्शाता है। GetWindowThreadProcessId प्रत्येक धागे की प्रक्रिया और आईडी प्राप्त करता है।

अब आपके पास किसी भी जीयूआई एप्लिकेशन को गहन रूप से बंद करने के लिए पर्याप्त जानकारी है।

आप WM_CLOSE संदेश भेज सकते हैं जो आप बंद करना चाहते हैं। उपयोगकर्ता विंडोज़ दस्तावेजों को सहेजने के लिए संकेत देने के लिए WM_CLOSE को संभालते हैं। संदेश संदेश लूप को समाप्त करने के कारण PostThreadMessage का उपयोग करके WM_QUIT संदेश PostThreadMessage का उपयोग कर संदेश भेज सकता है।

उपयोगकर्ता कोड खिड़कियों के लिए एक अलग एप्लिकेशन या धागे से DestroyWindow कॉल करने के लिए ... अगर एप्लिकेशन WM_CLOSE या WM_QUIT अनुरोध आप TerminateProcess देश में वापस आ गए हैं का जवाब नहीं है अनुमति नहीं है।

यह एप्लिकेशन प्रक्रिया के रूप में कंसोल अनुप्रयोगों को बंद नहीं करेगा, और खिड़की के मालिक की प्रक्रिया अलग-अलग होगी।

विंडोज पर कंसोल अनुप्रयोगों को शानदार तरीके से बंद करने का कोई वास्तविक तरीका नहीं है। उन्हें किसी तरह के सुन्दर करीबी तंत्र का समर्थन करने की आवश्यकता है।

+0

जब मेरे पास प्रक्रिया की सभी विंडो हैं, तो क्या मैं प्रत्येक शीर्ष-स्तरीय विंडो में 'WM_CLOSE' भेजता हूं? –

+0

बिल्कुल वही जो मैं कहने वाला था। +1। –

+2

हां - कार्य प्रबंधक एप को 'WM_CLOSE' संदेश भेजता है। असल में मुझे लगता है कि यह 'WM_SYSCOMMAND',' SC_CLOSE' संदेश भेज सकता है। –

15

मैं Win32 एपिस के बारे में भी निश्चित नहीं हूं लेकिन आप taskkill कमांड लाइन फ़ंक्शन निष्पादित कर सकते हैं।

taskkill /? 
taskkill /pid 1230 
taskkill /im notepad.exe 

/च स्विच मार मजबूर होना पड़ा लेकिन अभी आवेदन शान से बंद कर देता है यह सिर्फ समाप्ति संकेत भेजता है का उपयोग नहीं।

+4

दुर्भाग्यवश यह केवल विंडोज एक्सपी प्रोफेशनल या नए पर उपलब्ध है। (एक्सपी होम भी नहीं), लेकिन मुझे विंडोज 2000 और एक्सपी होम के लिए भी उस कार्यक्षमता की आवश्यकता है। लेकिन मुझे उस उपकरण का स्रोत कोड देखना अच्छा लगेगा :) –

13
+0

+1। क्रिस बेके के समाधान के साथ बहुत अधिक ओवरलैप करता है, साथ ही 16-बिट ऐप्स के साथ कोने के मामलों को संभालने का वर्णन करता है। अच्छा लगा। –

+9

पृष्ठ को नीचे/स्थानांतरित होने पर आपको यहां कुछ सामग्री भी लिखनी चाहिए। – MasterMastic

+0

केवल लिंक लिंक अच्छे जवाब नहीं हैं। मास्टरमैस्टिक के रूप में कृपया सुझाव दें और इस उत्तर में वास्तविक सामग्री डालें। –

1

EndTask एपीआई का उपयोग करें। यह वही कार्य है जिसका उपयोग कार्य प्रबंधक द्वारा किया जाता है।

BOOL EndTask(  
    HWND hWnd, 
    BOOL fShutDown, 
    BOOL fForce 
); 

http://msdn.microsoft.com/en-us/library/ms633492(VS.85).aspx

+7

उस पृष्ठ में टेक्स्ट की पहली पंक्ति कहती है: * [यह फ़ंक्शन सामान्य उपयोग के लिए नहीं है। इसे विंडोज के बाद के संस्करणों में बदला या अनुपलब्ध किया जा सकता है।] *। शायद upvoters के माध्यम से क्लिक नहीं किया? – Jon

+2

@ जोन कई एपीआई के पास संकेत है लेकिन कई समस्याओं को उनका उपयोग किए बिना हल नहीं किया जा सकता है। वही "अनियंत्रित" पर लागू होता है। (मैं यह नहीं कह रहा हूं कि यह ऐसे मामलों में से एक है) –

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