Запустить код на консоли? - PullRequest
8 голосов
/ 28 марта 2012

Я пишу приложение на C #, которое должно загружать файл, когда консоль закрыта (будь то с помощью кнопки X или выключен компьютер).

Как я могу это сделать?

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

Запускается, только когда я запускаю команду exit для консоли, а не когда я нажимаю красную кнопку закрытия.

Просим отвечать только в том случае, если решение запускается одновременно, когда консоль закрыта черезкнопка X и когда компьютер выключен (обычно через Windows, я знаю, что вы не можете, если питание отключено xD).

Ответы [ 3 ]

10 голосов
/ 28 марта 2012

Вы должны вызвать WIN32 API, для этого просто взгляните на этот пост здесь 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
}

Он делает именно то, что вам нужно.

Привет,

1 голос
/ 28 марта 2012

Я также хотел бы предложить вам сохранить то, что вы хотите загрузить на потом, чтобы у вас не было загруженных битых / недействительных файлов. Таким образом, при следующем запуске приложения загрузка может быть выполнена. Это, по крайней мере, работает для выхода из системы / выключения:

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
}
0 голосов
/ 28 марта 2012

Может быть как-то так (при условии, что я правильно понял вашу просьбу)

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


// find that one you interested in 
Process mypro;

Подписаться на Process.Exited событие, подобное

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

Если будет работать на вас.

...