c# - कंसोल ऐप के साथ सी#पर सीक पर उत्पन्न होने वाली कंसोल Ctrl एंटेक्ट




process console (2)

मुझे यह काम करने की कोशिश कर रहे सबसे कठिन समय हो रहा है, उम्मीद है कि आप में से एक ने यह पहले किया है।

मेरे पास एक सी # कन्सोल ऐप है जो कि एक चाइल्ड प्रोसेस चल रहा है जो इसकी सांत्वना को संभालता है मुझे एक बाहरी ऐप के द्वारा ctrl-c पकड़ा जाना चाहिए जो आंतरिक ऐप में पारित हो जाता है ताकि इसे अच्छी तरह से बंद करने का मौका मिल सके।

मेरे पास कुछ बहुत ही सरल कोड है मैं एक प्रक्रिया शुरू करता हूँ, फिर इसे WaitForExit (10) के साथ मतदान करें। मेरे पास एक CancelKeyPress हैंन्डलर भी पंजीकृत है, जो कि जब यह आग लगाते हैं तो खूल को सही बनाता है। पोलिंग लूप यह भी जांचता है, और जब यह सत्य है, तो यह GenerateConsoleCtrlEvent () कॉल करता है (जो मैंने पिनोवोक के माध्यम से मैप किया है)।

मैंने जेनरेट करने के लिए पैरामीटर के कई संयोजनों की कोशिश की है कंसोल CtrlEvent ()। पहले परम के लिए 0 या 1, और या तो 0 या दूसरे परम के लिए बच्चे की प्रक्रिया का आईडी। कुछ भी काम करने लगता है कभी-कभी मुझे एक झूठी पीठ और मार्शल मिलता है। GetLastWin32Error () 0 देता है, और कभी-कभी मुझे सच वापस मिल जाता है लेकिन कोई भी बाल एप्लिकेशन को ctrl-c प्राप्त करने का कारण नहीं है

पूरी तरह से सुनिश्चित होने के लिए, मैंने चाइल्ड ऐप बनने के लिए एक परीक्षण सी # ऐप लिखा था जो यह बताता है कि इसके साथ क्या हो रहा है और यह सत्यापित किया जाता है कि मैन्युअल रूप से सीटी-सी-सी टाइप करने पर मैन्युअल रूप से टाइप करते समय उसे छोड़ना ठीक होता है

मैं इसके खिलाफ कुछ समय के लिए मेरे सिर की पीट कर रहा हूं। क्या कोई मुझे इस पर जाने के लिए कहां बता सकता है?


क्या आपके पास इस के साथ कोई भाग्य है? मेरी समझ यह है कि जब आप कंसोल में CTRL + C दबाते हैं, तो डिफ़ॉल्ट रूप से कंसोल से जुड़ी सभी प्रक्रियाएं इसे प्राप्त होती हैं, न केवल पैरेंट एक यहां एक उदाहरण है:

Child.cs:

using System;

public class MyClass
{
    public static void CtrlCHandler(object sender, ConsoleCancelEventArgs args)
    {
        Console.WriteLine("Child killed by CTRL+C.");
    }
    public static void Main()
    {
        Console.WriteLine("Child start.");
        Console.CancelKeyPress += CtrlCHandler;
        System.Threading.Thread.Sleep(4000);
        Console.WriteLine("Child finish.");
    }
}

Parent.cs:

using System;

public class MyClass
{
    public static void CtrlCHandler(object sender, ConsoleCancelEventArgs args)
    {
        Console.WriteLine("Parent killed by CTRL+C.");
    }
    public static void Main()
    {
        Console.CancelKeyPress += CtrlCHandler;
        Console.WriteLine("Parent start.");
        System.Diagnostics.Process child = new System.Diagnostics.Process();
        child.StartInfo.UseShellExecute = false;
        child.StartInfo.FileName = "child.exe";
        child.Start();
        child.WaitForExit();
        Console.WriteLine("Parent finish.");
    }
}

आउटपुट:

Y:\>parent
Parent start.
Child start.
Parent killed by CTRL+C.
Child killed by CTRL+C.
^C
Y:\>parent
Parent start.
Child start.
Child finish.
Parent finish.

तो मुझे नहीं लगता था कि आपको कुछ विशेष करना होगा हालांकि, अगर आपको वास्तव में CTRL + C इवेंट स्वयं उत्पन्न करने की आवश्यकता है, तो चीजें इतनी आसान नहीं हो सकतीं मुझे आपके द्वारा बताई गई समस्याओं के बारे में निश्चित नहीं है, लेकिन जहाँ तक मैं आपको बता सकता हूं कि कंसोल विंडो से जुड़ी सभी प्रक्रियाओं में केवल CTRL + C इवेंट भेज सकते हैं। यदि आप कोई प्रक्रिया अलग करते हैं, तो आप इसे CTRL + C इवेंट्स नहीं भेज सकते। यदि आप CTRL + C ईवेंट भेजने के लिए प्रक्रियाओं में चयनात्मक होना चाहते हैं, तो आपको प्रत्येक एक के लिए नई कंसोल विंडो बनाने की आवश्यकता होती है। मुझे नहीं पता है कि यह दृश्य विंडो के बिना करने का कोई तरीका है या जब आप पाइपों के जरिए I / O का पुनर्निर्देशित करना चाहते हैं


इतना यकीन नहीं है कि यह एक अच्छा तरीका है यह केवल तभी काम करता है जब CreateProcess() लिए CREATE_NEW_PROCESS_GROUP फ्लैग के साथ बाल प्रक्रिया बनाई जाती है CreateProcess() । System.Diagnostics.Process वर्ग हालांकि इस का समर्थन नहीं करता है।

मुख्य () विधि से वापसी मान का उपयोग करने पर विचार करें Ctrl + C बंद, STATUS_CONTROL_C_EXIT या 0xC000013A के लिए पहले से ही एक अद्वितीय मूल्य परिभाषित किया गया है। माता-पिता प्रक्रिया उस रिटर्न कोड को Process.ExitCode प्रॉपर्टी से प्राप्त कर सकती है।





copy-paste