2012-03-27 12 views
8

मैं एक सी # ऐप लिख रहा हूं जिसे कंसोल बंद होने पर फ़ाइल अपलोड करने की आवश्यकता है (इसे एक्स बटन के माध्यम से करें, या कंप्यूटर बंद हो गया है)।कंसोल पर रन कोड बंद करें?

मैं यह कैसे कर सकता हूं?

AppDomain.CurrentDomain.ProcessExit += new EventHandler (OnExit); 

केवल चलाता है जब मैं कंसोल के लिए exit आदेश जारी, जब नहीं मैं लाल बंद करें बटन मारा।

कृपया केवल तभी जवाब दें जब कंसोल एक्स बटन के माध्यम से बंद हो जाता है, और जब कंप्यूटर बंद हो जाता है (आमतौर पर विंडोज के माध्यम से, मुझे पता है कि आप नहीं कर सकते हैं कि बिजली xD खींच लिया गया है)।

+3

खेद कर कहते हैं कि लेकिन परिदृश्यों जहाँ आपके प्रक्रिया मार दिया जाता है, ताकि आप इस हर संभव स्थिति में काम करने के लिए (हो सकता है आप Win7 जहां पर यह देखा है नहीं मिल सकता है देखते हैं आपने शट डाउन मारा और सिस्टम आपको बताता है कि कुछ प्रक्रियाएं शट डाउन को रोकती हैं और आप उन्हें समाप्त करना चुन सकते हैं) – Carsten

+0

@ कार्स्टनकॉन्ग मैं समझता हूं कि ऐसी स्थितियां हैं, लेकिन मैं चाहता हूं कि कम से कम सामान्य शट डाउन प्रक्रिया के तहत काम करें उपयोगकर्ता ऐप्स को बंद करने के लिए मजबूर नहीं करता है। –

+0

संभावित डुप्लिकेट http://stackoverflow.com/questions/474679/capture-console-exit-c-sharp –

उत्तर

10

आप Win32 एपीआई आह्वान करने के लिए, यह करने के लिए, बस इस पोस्ट यहाँ http://social.msdn.microsoft.com/Forums/en-US/csharpgeneral/thread/707e9ae1-a53f-4918-8ac4-62a1eddb3c4a/

पर एक नज़र मैं वहाँ से आप के लिए प्रासंगिक कोड की नकल की है है:

class Program 

{ 
    private static bool isclosing = false; 

    static void Main(string[] args) 
    { 
     SetConsoleCtrlHandler(new HandlerRoutine(ConsoleCtrlCheck), true); 

     Console.WriteLine("CTRL+C,CTRL+BREAK or suppress the application to exit"); 

     while (!isclosing) ; 
    } 

    private static bool ConsoleCtrlCheck(CtrlTypes ctrlType) 
    { 
     // Put your own handler here 

     switch (ctrlType) 
     { 
      case CtrlTypes.CTRL_CLOSE_EVENT: 
       isclosing = true; 
       Console.WriteLine("Program being closed!"); 
       break; 
     } 

     return true; 
    } 

    #region unmanaged 
    // Declare the SetConsoleCtrlHandler function 
    // as external and receiving a delegate. 

    [DllImport("Kernel32")] 
    public static extern bool SetConsoleCtrlHandler(HandlerRoutine Handler, bool Add); 

    // A delegate type to be used as the handler routine 
    // for SetConsoleCtrlHandler. 
    public delegate bool HandlerRoutine(CtrlTypes CtrlType); 

    // An enumerated type for the control messages 
    // sent to the handler routine. 

    public enum CtrlTypes 
    { 
     CTRL_C_EVENT = 0, 
     CTRL_BREAK_EVENT, 
     CTRL_CLOSE_EVENT, 
     CTRL_LOGOFF_EVENT = 5, 
     CTRL_SHUTDOWN_EVENT 
    } 

    #endregion 
} 

यह बिल्कुल करता है जिसकी आपको जरूरत है।

नमस्ते,

+0

यह पूरी तरह से काम करता है! –

0

हो सकता है कुछ इस तरह (यह मानते हुए कि मैं सही समझा आप अनुरोध)

//get all command windows in the system 
Process[] processes = Process.GetProcessesByName("cmd"); 


// find that one you interested in 
Process mypro; 

की तरह आप के लिए

mypro.Exited += (s,e) => 
{ 
    //here upload the file 
} 

चाहिए काम यह Process.Exited घटना के लिए सदस्यता लें।

+0

मुझे लगता है, आपको ऐसा कभी नहीं करना चाहिए! क्योंकि अगर "cmd" नामक एक से अधिक एकल प्रक्रियाएं होती हैं तो क्या होगा। यदि आप प्रक्रिया की सदस्यता लेना चाहते हैं, तो कृपया कोड में कुछ फ़िल्टरिंग जोड़ें, e.h. प्रक्रिया-विंडो का नाम और प्रक्रिया स्वयं नहीं। –

+0

@ मारियोफ्राइस: निश्चित रूप से। वास्तव में इस * कहानी * उस * cmd प्रक्रिया को मेरे पोस्ट में छोड़ दिया गया था के बारे में कहानी। 'Cmd.exe' को अनुरोध करने में सक्षम होने के लिए आपको" मजबूत कुंजी "की आवश्यकता है। – Tigran

1

मैं यह भी सुझाव है कि आप को बचाने के लिए करना चाहिए कि आप क्या करते हैं बाद में तो तुम हड्डी टूट गई है नहीं/अमान्य अपलोड की गई फ़ाइलों के लिए अपलोड करना चाहते हैं पसंद करेंगे। अगली बार एप्लिकेशन शुरू होने के बाद, अपलोड किया जा सकता है। यह एक कम से कम सिस्टम लॉग ऑफ/शटडाउन के लिए काम करता है:

SystemEvents.SessionEnding += (SystemEvents_SessionEnding); 

private static void SystemEvents_SessionEnding(object sender, SessionEndingEventArgs e) 
{ 
    //code to run on when user is about to logoff or shutdown 
} 
संबंधित मुद्दे