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

                   有時(shí)候運(yùn)行在服務(wù)器上的控制臺(tái)程序,需要記錄詳細(xì)的運(yùn)行日志,這就需要對(duì)程序關(guān)閉進(jìn)行日志記錄,以便能根據(jù)日志了解程序的運(yùn)行狀況。比如正在運(yùn)行的程序被 人不小心關(guān)閉了,導(dǎo)致最終任務(wù)沒有運(yùn)行成功,這時(shí)日志也沒有錯(cuò)誤記錄,對(duì)分析原因造成不便,記錄了關(guān)閉事件日志后就能了解到這種情況是程序被終止了。這樣 注意通過消息鉤子來(lái)實(shí)現(xiàn),通過調(diào)用WIN32 API SetConsoleCtrlHandler方法來(lái)實(shí)現(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時(shí),系統(tǒng)會(huì)發(fā)送次消息
                    private const int CTRL_CLOSE_EVENT = 2;
                    //Ctrl+C,系統(tǒng)會(huì)發(fā)送次消息
                    private const int CTRL_C_EVENT = 0;
                    //Ctrl+break,系統(tǒng)會(huì)發(fā)送次消息
                    private const int CTRL_BREAK_EVENT = 1;
                    //用戶退出(注銷),系統(tǒng)會(huì)發(fā)送次消息
                    private const int CTRL_LOGOFF_EVENT = 5;
                    //系統(tǒng)關(guān)閉,系統(tǒng)會(huì)發(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)對(duì)該程序的操作
                        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)用包含這個(gè)頭文件就可以。

            return true的時(shí)候關(guān)閉的時(shí)候會(huì)產(chǎn)生應(yīng)用程序無(wú)法關(guān)閉的錯(cuò)誤,不知道什么原因。return false則不會(huì)。根據(jù)msdn上的方法說(shuō)明 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. 按照這個(gè)解釋,返回true也不應(yīng)該出現(xiàn)應(yīng)用程序無(wú)法關(guān)閉的錯(cuò)誤,不知道是什么原因。

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


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


            導(dǎo)航

            統(tǒng)計(jì)

            常用鏈接

            留言簿(3)

            隨筆分類

            隨筆檔案

            搜索

            最新評(píng)論

            閱讀排行榜

            評(píng)論排行榜

            久久99精品国产麻豆| 久久国产乱子精品免费女| 久久久久国产精品嫩草影院| 久久婷婷五月综合97色直播| 国产∨亚洲V天堂无码久久久| 韩国三级中文字幕hd久久精品| 伊人久久大香线蕉无码麻豆| 久久w5ww成w人免费| 青青草国产精品久久| 乱亲女H秽乱长久久久| 久久久久久av无码免费看大片| 人妻精品久久久久中文字幕一冢本| 国产精品gz久久久| 久久久久成人精品无码中文字幕| 久久91这里精品国产2020| 久久精品aⅴ无码中文字字幕重口 久久精品a亚洲国产v高清不卡 | 久久夜色精品国产www| 亚洲中文字幕无码久久2020| 久久久久久青草大香综合精品| 99久久婷婷国产综合亚洲| 精品国产乱码久久久久久呢| 久久国产精品无码网站| 久久久久久九九99精品| 亚洲av伊人久久综合密臀性色| 亚洲国产香蕉人人爽成AV片久久| 久久综合中文字幕| 嫩草影院久久国产精品| A狠狠久久蜜臀婷色中文网| 日韩人妻无码精品久久免费一| 亚洲午夜久久久| 伊人久久大香线蕉综合热线| 无码任你躁久久久久久老妇| 久久se精品一区精品二区国产| 国内精品久久久久国产盗摄| 国产成人AV综合久久| 国产精品狼人久久久久影院| 久久久久国产精品| 久久国产精品免费| 久久人妻无码中文字幕| 亚洲中文字幕无码久久精品1| 久久久无码精品亚洲日韩蜜臀浪潮|