• <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>

            colorful

            zc qq:1337220912

             

            SetConsoleCtrlHandler

                   有時候運行在服務(wù)器上的控制臺程序,需要記錄詳細(xì)的運行日志,這就需要對程序關(guān)閉進(jìn)行日志記錄,以便能根據(jù)日志了解程序的運行狀況。比如正在運行的程序被 人不小心關(guān)閉了,導(dǎo)致最終任務(wù)沒有運行成功,這時日志也沒有錯誤記錄,對分析原因造成不便,記錄了關(guān)閉事件日志后就能了解到這種情況是程序被終止了。這樣 注意通過消息鉤子來實現(xiàn),通過調(diào)用WIN32 API SetConsoleCtrlHandler方法來實現(xiàn),具體代碼如下:


            using System;
            using System.Windows.Forms;
            using System.Diagnostics;
            using System.Runtime.InteropServices;


            namespace ConsoleColsed
            {
                public delegate bool ConsoleCtrlDelegate(int ctrlType);
                class Program
                {
                    [DllImport("kernel32.dll")]
                    private static extern bool SetConsoleCtrlHandler(ConsoleCtrlDelegate HandlerRoutine, bool Add);
                    //當(dāng)用戶關(guān)閉Console時,系統(tǒng)會發(fā)送次消息
                    private const int CTRL_CLOSE_EVENT = 2;
                    //Ctrl+C,系統(tǒng)會發(fā)送次消息
                    private const int CTRL_C_EVENT = 0;
                    //Ctrl+break,系統(tǒng)會發(fā)送次消息
                    private const int CTRL_BREAK_EVENT = 1;
                    //用戶退出(注銷),系統(tǒng)會發(fā)送次消息
                    private const int CTRL_LOGOFF_EVENT = 5;
                    //系統(tǒng)關(guān)閉,系統(tǒng)會發(fā)送次消息
                    private const int CTRL_SHUTDOWN_EVENT = 6;

                    static void Main(string[] args)
                    {
                        Program cls = new Program();
                        //Console.ReadKey();
                    }
                    public Program()
                    {
                        ConsoleCtrlDelegate consoleDelegete = new ConsoleCtrlDelegate(HandlerRoutine);

                        bool bRet = SetConsoleCtrlHandler(consoleDelegete, true);
                        if (bRet == false) //安裝事件處理失敗
                        {
                            Debug.WriteLine("error");
                        }
                        else
                        {
                            Console.WriteLine("ok");
                            Console.Read();
                        }

                    }

                    private static bool HandlerRoutine(int ctrlType)
                    {
                        switch(ctrlType)
                        {
                            case CTRL_C_EVENT:
                                MessageBox.Show("C");
                                break;
                            case CTRL_BREAK_EVENT:
                                MessageBox.Show("BREAK");
                                break;
                            case CTRL_CLOSE_EVENT:
                                MessageBox.Show("CLOSE");
                                break;
                            case CTRL_LOGOFF_EVENT:
                                break;
                            case CTRL_SHUTDOWN_EVENT:
                                break;
                        }
                        //return true;//表示阻止響應(yīng)系統(tǒng)對該程序的操作
                        return false;//忽略處理,讓系統(tǒng)進(jìn)行默認(rèn)操作
                    }
                }
            }

            CTRL_CLOSE_EVENT 這些都是在C:\Program Files\Microsoft Visual Studio 8\VC\PlatformSDK\Include\WinCon.h中定義的,c或者c++調(diào)用包含這個頭文件就可以。

            return true的時候關(guān)閉的時候會產(chǎn)生應(yīng)用程序無法關(guān)閉的錯誤,不知道什么原因。return false則不會。根據(jù)msdn上的方法說明 If the function handles the control signal, it should return TRUE. If it returns FALSE, the next handler function in the list of handlers for this process is used. 按照這個解釋,返回true也不應(yīng)該出現(xiàn)應(yīng)用程序無法關(guān)閉的錯誤,不知道是什么原因。

            posted on 2012-04-24 22:44 多彩人生 閱讀(1225) 評論(0)  編輯 收藏 引用


            只有注冊用戶登錄后才能發(fā)表評論。
            網(wǎng)站導(dǎo)航: 博客園   IT新聞   BlogJava   博問   Chat2DB   管理


            導(dǎo)航

            統(tǒng)計

            常用鏈接

            留言簿(3)

            隨筆分類

            隨筆檔案

            搜索

            最新評論

            閱讀排行榜

            評論排行榜

            欧美一区二区精品久久| 久久精品国产免费观看| 69SEX久久精品国产麻豆| 国产99久久精品一区二区| 国产午夜精品理论片久久| 久久久久无码国产精品不卡| 亚洲午夜久久久久久久久久| 久久精品国产免费| 亚洲va中文字幕无码久久| 亚洲成人精品久久| 久久久亚洲欧洲日产国码aⅴ | 国产成人综合久久综合 | 亚洲婷婷国产精品电影人久久| 中文无码久久精品| 色婷婷久久综合中文久久一本| 久久综合给合久久狠狠狠97色| 久久久受www免费人成| 国产精品久久久久久久久鸭| 麻豆精品久久久久久久99蜜桃| 国产成人精品久久| 精品国产乱码久久久久久郑州公司| 亚洲国产综合久久天堂| 国产精品久久久久久久午夜片 | 国产精品美女久久久久AV福利 | 国产成人久久777777| 无码人妻久久一区二区三区 | 久久久亚洲欧洲日产国码二区 | 久久久久一本毛久久久| 久久99国产精品99久久| 91精品国产高清久久久久久io | 久久99国产精品二区不卡| 麻豆亚洲AV永久无码精品久久| 久久精品国产只有精品66| 欧美777精品久久久久网| 久久国产精品-久久精品| 韩国免费A级毛片久久| 久久精品aⅴ无码中文字字幕不卡| 亚洲伊人久久精品影院| 久久精品中文騷妇女内射| 亚洲午夜久久久久久噜噜噜| 久久久婷婷五月亚洲97号色 |