2012-02-12 13 views
11

मैं कुछ नाम के साथ विंडो बंद करना चाहता हूं (उदाहरण के लिए, कोई कैलकुलेटर और आदि)। सी # में इसे कैसे करें? WinAPI कार्यों को आयात करें?विंडो को इसके नाम से कैसे बंद करें?

+3

http://www.codeproject.com/Articles/22257/Find-and-Close-the-Window-using-Win-API ... google rox आप जानते हैं – m0s

+0

संभावित डुप्लिकेट। http://stackoverflow.com/questions/116090/how-do-i-kill-a-process-using-vb-net-or-c – Lloyd

+0

@ लॉयड: एक डुप्लिकेट नहीं, प्रक्रिया को मारना वही बात नहीं है एक खिड़की बंद करना –

उत्तर

23

हां, आपको विंडोज एपीआई फ़ंक्शन आयात करना चाहिए: FindWindow(), SendMessage(); और WM_CLOSE निरंतर।

Windows API कार्यों का मूल निवासी परिभाषाएँ:

[DllImport("user32.dll", SetLastError = true)] 
static extern IntPtr FindWindow(string lpClassName, string lpWindowName); 

/// <summary> 
/// Find window by Caption only. Note you must pass IntPtr.Zero as the first parameter. 
/// </summary> 
[DllImport("user32.dll", EntryPoint = "FindWindow", SetLastError = true)] 
static extern IntPtr FindWindowByCaption(IntPtr ZeroOnly, string lpWindowName); 

[DllImport("user32.dll", CharSet = CharSet.Auto)] 
static extern IntPtr SendMessage(IntPtr hWnd, UInt32 Msg, IntPtr wParam, IntPtr lParam); 

const UInt32 WM_CLOSE = 0x0010; 

क्लाइंट कोड:

IntPtr windowPtr = FindWindowByCaption(IntPtr.Zero, "Untitled - Notepad"); 
if (windowPtr == IntPtr.Zero) 
{ 
    Console.WriteLine("Window not found"); 
    return; 
} 

SendMessage(windowPtr, WM_CLOSE, IntPtr.Zero, IntPtr.Zero); 
+1

हां, यह नोटपैड के लिए ठीक काम करता है (मान लीजिए कि, विंडो शीर्षक बिल्कुल वही है जो आपने यहां दिया है, जो शायद यह अधिकतर समय नहीं है)। लेकिन यह उन अनुप्रयोगों के लिए काम नहीं करेगा जिनके पास एकाधिक शीर्ष-स्तरीय विंडो हैं, जब तक कि उन्हें विशेष रूप से एक शीर्ष-स्तरीय विंडो के समापन के बाद पूरे ऐप को बंद करने के लिए डिज़ाइन नहीं किया गया हो। अन्यथा, यह सुनिश्चित करने के लिए कि ऐप बंद हो जाए, आपको शीर्ष-स्तरीय विंडो के * प्रत्येक * को 'WM_CLOSE'' भेजने की आवश्यकता है। –

+1

इसके अतिरिक्त, ऐप्स 'WM_CLOSE' को प्रतिसाद देने का विकल्प चुन सकते हैं, हालांकि उन्हें पसंद है। उदाहरण के लिए, कुछ प्रोग्राम वास्तव में बंद होने के बजाय, इस संदेश की प्राप्ति के बाद टास्कबार के अधिसूचना क्षेत्र में स्वयं को कम करने का विकल्प चुनते हैं। चूंकि आप इस बात को नियंत्रित नहीं कर सकते कि एप्लिकेशन संदेश को कैसे प्रतिक्रिया देता है, आपको इस विधि को व्यापक रूप से जांचने की आवश्यकता है और यह पता चलता है कि अज्ञात और अवांछित अनुप्रयोगों से निपटने के दौरान यह कितना संभावित रूप से नाजुक है। –

+0

क्या यह सही है 'CloseWindow (windowPtr)'? –

1

आप अन्य प्रक्रियाओं से संबंधित विंडो बंद करने की कोशिश कर रहे हैं। यह ऐसा कुछ नहीं है जिसे आप मान सकते हैं भरोसेमंद होगा। एक बात के लिए, आपके पास उन खिड़कियों का स्वामित्व नहीं है, इसलिए आपके पास अन्य प्रक्रियाओं की खिड़कियों के साथ जाने और गड़बड़ करने के लिए वास्तव में कोई स्वचालित अधिकार नहीं है।

जैसा कि अन्य उत्तर बताता है, आप खिड़की पर WM_CLOSE भेजने का प्रयास कर सकते हैं, लेकिन यह चेतावनी के साथ आता है कि दूसरी प्रक्रिया वास्तव में इसका सम्मान करने के हकदार नहीं है। WM_CLOSE की प्रतिक्रिया स्वीकृति के लिए कुछ भी हो सकती है और पूरी तरह से अस्वीकृति के लिए एक साफ शट डाउन हो सकती है। बाद के मामले में, आपको वास्तव में कोई विकल्प नहीं मिला है। यह आपकी प्रक्रिया नहीं है। जैसा कि आपने देखा है, बीच में, किसी भी प्रकार की इंटरमीडिएट विंडो, डायलॉग बॉक्स इत्यादि हो सकती हैं, जिन्हें आप के साथ संघर्ष करना होगा।

तो आप यहां क्या हासिल करने की कोशिश कर रहे हैं? आप अन्य प्रक्रियाओं से संबंधित खिड़कियां बंद करने की कोशिश क्यों कर रहे हैं? यह स्पष्ट करने में मदद कर सकता है कि उद्देश्य क्या है।

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