<strike id="rrvnz"></strike>

    <noframes id="rrvnz">
    <noframes id="rrvnz"><span id="rrvnz"><pre id="rrvnz"></pre></span><address id="rrvnz"></address>
    <address id="rrvnz"><nobr id="rrvnz"></nobr></address><noframes id="rrvnz">
      <em id="rrvnz"></em>

        首 頁IT知識庫翔宇問吧收藏本站
        當前位置:翔宇亭IT樂園IT知識庫C#專區窗體界面

        WinForm 下實現一個自動關閉的MessageBox

        減小字體 增大字體 作者:eaglet  來源:cnblogs.com  發布時間:2014-02-16 22:58:08

        在一些程序中,我們會發現彈出的的對話框會自動關閉,那么在C#的WinForm中是否也可以實現這種功能呢? 下面轉載了cnblogs.com eaglet的一篇文章,該文章中使用API函數來實現該功能。

        WinForm中可以調用MessageBox.Show 來顯示一個消息對話框,提示用戶確認等操作。在有些應用中我們需要通過程序來自動關閉這個消息對話框而不是由用戶點擊確認按鈕來關閉。然而.Net framework 沒有為我們提供自動關閉MessageBox 的方法,要實現這個功能,我們需要使用Window API 來完成。

        首先我們需要找到這個消息對話框的窗口句柄,一個比較簡單的方法就是用 FindWindow API 來查找對應的窗體句柄。

        [DllImport("user32.dll", SetLastError = true)]
        static extern IntPtr FindWindow(string lpClassName, string lpWindowName);

        這個API調用可以通過窗口的類名或者窗口標題的名字來查找窗口句柄。接下來我們還需要找到一個 API 來關閉對話框,這里我使用 EndDialog

        [DllImport("user32.dll")]
        static extern bool EndDialog(IntPtr hDlg, out IntPtr nResult);

        有了這兩個API函數,我們就可以來關閉消息對話框了。思路是在調用MessageBox.Show 前啟動一個后臺工作線程,這個工作線程等待一定時間后開始查找消息對話框的窗口句柄,找到后調用EndDialog API 函數關閉這個消息對話框。不過這個方法有個問題,就是如果同時又多個同名的消息對話框(可能不一定是這個應用的),這樣做可能會關錯窗口,如何解決這個問題,我還沒有想出比較好的方法,如果大家有更好的方法解決這個問題,不妨一起討論討論。

        我根據這個思路編寫了延時關閉消息對話框的函數

        public void ShowMessageBoxTimeout(string text, string caption,
        MessageBoxButtons buttons, int timeout)
        {
        ThreadPool.QueueUserWorkItem(new WaitCallback(CloseMessageBox),
        new CloseState(caption, timeout));
        MessageBox.Show(text, caption,buttons);
        }

        這個函數中timeout 參數單位是毫秒,其他參數和MessageBox.Show的參數含義是一樣的,這里不再詳細說明。

        這個函數中首先利用線程池調用一個工作線程 CloseMessageBox ,并將對話框的標題和延時時間通過CloseState這個類傳遞給CloseMessageBox函數。

        CloseState 的定義如下:

        private class CloseState
        {
        private int _Timeout;/**//// <summary>
        /// In millisecond
        /// </summary>
        public int Timeout
        {
        get
        {
        return _Timeout;
        }
        }private string _Caption;/**//// <summary>
        /// Caption of dialog
        /// </summary>
        public string Caption
        {
        get
        {
        return _Caption;
        }
        }public CloseState(string caption, int timeout)
        {
        _Timeout = timeout;
        _Caption = caption;
        }
        }

        最后就是CloseMessageBox函數了,直接看代碼吧

        private void CloseMessageBox(object state)
        {
        CloseState closeState = state as CloseState;Thread.Sleep(closeState.Timeout);
        IntPtr dlg = FindWindow(null, closeState.Caption);if (dlg != IntPtr.Zero)
        {
        IntPtr result;
        EndDialog(dlg, out result);
        }
        }

        原文地址:http://www.cnblogs.com/eaglet/archive/2009/07/24/1529920.html

        知識評論評論內容只代表網友觀點,與本站立場無關!

           評論摘要(共 0 條,得分 0 分,平均 0 分) 查看完整評論

        用戶名: 查看更多評論

        分 值:100分 90分 80分 70分 60分 40分 20分

        內 容:

        請注意用語文明且合法,不要發布帶有攻擊性、侮辱性的言論,謝謝合作!

        驗證碼:

        關于本站 | 網站幫助 | 廣告合作 | 網站聲明 | 友情連接 | 網站地圖 | 用戶守則 | 聯系我們
        本站部分內容來自互聯網,如有侵權,請來信告之,謝謝!
        Copyright © 2007-2019 biye5u.com. All Rights Reserved.
        網站備案號:黑ICP備13005378號-3
        特黄特色三级在线观看 - 视频 - 在线观看 - 影视资讯 -心晴网