• <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

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


            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);
                    //當用戶關閉Console時,系統會發送次消息
                    private const int CTRL_CLOSE_EVENT = 2;
                    //Ctrl+C,系統會發送次消息
                    private const int CTRL_C_EVENT = 0;
                    //Ctrl+break,系統會發送次消息
                    private const int CTRL_BREAK_EVENT = 1;
                    //用戶退出(注銷),系統會發送次消息
                    private const int CTRL_LOGOFF_EVENT = 5;
                    //系統關閉,系統會發送次消息
                    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;//表示阻止響應系統對該程序的操作
                        return false;//忽略處理,讓系統進行默認操作
                    }
                }
            }

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

            return true的時候關閉的時候會產生應用程序無法關閉的錯誤,不知道什么原因。return false則不會。根據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也不應該出現應用程序無法關閉的錯誤,不知道是什么原因。

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

            導航

            統計

            常用鏈接

            留言簿(3)

            隨筆分類

            隨筆檔案

            搜索

            最新評論

            閱讀排行榜

            評論排行榜

            人妻少妇久久中文字幕一区二区| 国产亚洲成人久久| 亚洲色大成网站www久久九| 国产精品9999久久久久| 久久精品人人做人人爽电影| 久久精品亚洲乱码伦伦中文| 97精品伊人久久大香线蕉| 国产三级久久久精品麻豆三级 | 亚洲国产成人久久一区久久| 精品久久久久久久久免费影院| 国产精品视频久久久| 国内精品伊人久久久久777| 精品久久久久久无码中文字幕| 18禁黄久久久AAA片| 久久精品国产亚洲Aⅴ蜜臀色欲| 蜜臀久久99精品久久久久久小说| 日日狠狠久久偷偷色综合96蜜桃| 97久久国产亚洲精品超碰热| 色婷婷综合久久久久中文 | 嫩草伊人久久精品少妇AV| 成人a毛片久久免费播放| 久久影院综合精品| 久久99久国产麻精品66| 久久天天躁夜夜躁狠狠| 亚洲国产精品综合久久网络| 精品无码久久久久久国产| 久久久久综合网久久| 精品久久久久久无码专区不卡| 久久久久亚洲AV成人网人人网站| 久久久久国产成人精品亚洲午夜| 亚洲国产成人久久精品影视| 九九久久99综合一区二区| 99久久婷婷国产综合亚洲| 久久人妻少妇嫩草AV无码专区| 中文字幕久久波多野结衣av| 亚洲精品乱码久久久久久久久久久久 | 欧美无乱码久久久免费午夜一区二区三区中文字幕| 婷婷久久香蕉五月综合加勒比| 人妻精品久久无码区| 国产麻豆精品久久一二三| 精品久久久久久国产三级|