14

コンソールが閉じられたときにファイルをアップロードする必要がある C# アプリを作成しています (X ボタンを使用するか、コンピューターをシャットダウンします)。

どうすればこれを行うことができますか?

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

exit赤い閉じるボタンを押したときではなく、コンソールにコマンドを発行したときにのみ実行されます。

コンソールが X ボタンで閉じられているときと、コンピューターがシャットダウンされているときの両方でソリューションが実行される場合にのみ回答してください (通常、Windows では、電源が xD に引っ張られている場合は実行できないことがわかっています)。

4

3 に答える 3

14

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
}

それはまさにあなたが必要とすることをします。

ご挨拶、

于 2012-03-27T20:39:53.537 に答える
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
}
于 2012-03-27T20:49:21.157 に答える
0

このようなものかもしれません(私があなたの要求を正しく理解したと仮定して)

//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
}

あなたのために働くはずです。

于 2012-03-27T20:38:12.443 に答える