国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 編程 > C# > 正文

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

2023-05-10 18:49:18
字體:
來源:轉載
供稿:網友

在一些程序中,我們會發現彈出的的對話框會自動關閉,那么在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);
}
}

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 虹口区| 郸城县| 徐水县| 广丰县| 扬州市| 陇南市| 荔波县| 嘉兴市| 黄浦区| 湘乡市| 巴塘县| 平陆县| 凯里市| 邵阳市| 三明市| 二手房| 宁明县| 临泉县| 天气| 安仁县| 宜良县| 池州市| 墨玉县| 长治县| 新乡县| 古田县| 莲花县| 蒙阴县| 山东省| 黑河市| 扬州市| 洛川县| 南岸区| 钟祥市| 会东县| 朝阳区| 武夷山市| 广南县| 车险| 海原县| 西贡区|