麻豆小视频在线观看_中文黄色一级片_久久久成人精品_成片免费观看视频大全_午夜精品久久久久久久99热浪潮_成人一区二区三区四区

首頁 > 編程 > C# > 正文

WinForm 下實(shí)現(xiàn)一個(gè)自動(dòng)關(guān)閉的MessageBox

2023-05-10 18:49:18
字體:
供稿:網(wǎng)友

在一些程序中,我們會(huì)發(fā)現(xiàn)彈出的的對(duì)話框會(huì)自動(dòng)關(guān)閉,那么在C#的WinForm中是否也可以實(shí)現(xiàn)這種功能呢? 下面轉(zhuǎn)載了cnblogs.com eaglet的一篇文章,該文章中使用API函數(shù)來實(shí)現(xiàn)該功能。

WinForm中可以調(diào)用MessageBox.Show 來顯示一個(gè)消息對(duì)話框,提示用戶確認(rèn)等操作。在有些應(yīng)用中我們需要通過程序來自動(dòng)關(guān)閉這個(gè)消息對(duì)話框而不是由用戶點(diǎn)擊確認(rèn)按鈕來關(guān)閉。然而.Net framework 沒有為我們提供自動(dòng)關(guān)閉MessageBox 的方法,要實(shí)現(xiàn)這個(gè)功能,我們需要使用Window API 來完成。

首先我們需要找到這個(gè)消息對(duì)話框的窗口句柄,一個(gè)比較簡(jiǎn)單的方法就是用 FindWindow API 來查找對(duì)應(yīng)的窗體句柄。

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

這個(gè)API調(diào)用可以通過窗口的類名或者窗口標(biāo)題的名字來查找窗口句柄。接下來我們還需要找到一個(gè) API 來關(guān)閉對(duì)話框,這里我使用 EndDialog

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

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

我根據(jù)這個(gè)思路編寫了延時(shí)關(guān)閉消息對(duì)話框的函數(shù)

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);
}

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

這個(gè)函數(shù)中首先利用線程池調(diào)用一個(gè)工作線程 CloseMessageBox ,并將對(duì)話框的標(biāo)題和延時(shí)時(shí)間通過CloseState這個(gè)類傳遞給CloseMessageBox函數(shù)。

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函數(shù)了,直接看代碼吧

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);
}
}

發(fā)表評(píng)論 共有條評(píng)論
用戶名: 密碼:
驗(yàn)證碼: 匿名發(fā)表
主站蜘蛛池模板: 欧美视频国产精品 | 国产人妖一区二区 | 亚洲人成中文字幕在线观看 | 国产成人在线观看免费 | 91短视频版高清在线观看免费 | 爱爱插插视频 | 国产成人精品自拍视频 | 日本a大片| 色啪综合| 久久久久久久久久久久久久国产 | 2019天天干夜夜操 | 久久精精 | 久久99国产精品久久 | 成人免费观看49www在线观看 | 欧美1区2区在线观看 | 草久免费| 婷婷久久久久久 | 久久精品久久久久 | 久久久久久久久日本理论电影 | 国产一国产一级毛片视频 | 久久恋| 男女羞羞视频在线免费观看 | 国产毛片自拍 | 91精品国啪老师啪 | 国产精品一区在线免费观看 | 日本网站一区 | 天天操天天骑 | 国产成人免费高清激情视频 | 91 在线观看 | 欧美特级一级毛片 | 国产乱色精品成人免费视频 | 亚洲亚色 | 中文字幕视频在线播放 | 欧美一级美国一级 | 免费色片| 亚洲精品午夜电影 | 日日碰日日操 | 毛片在线视频观看 | 欧美性a视频 | 国产手机av在线 | 黄色av网站在线观看 |