日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

java messagebox 关闭_wince/WinForm下实现一个自动关闭的MessageBox

發(fā)布時(shí)間:2025/4/5 编程问答 25 豆豆
生活随笔 收集整理的這篇文章主要介紹了 java messagebox 关闭_wince/WinForm下实现一个自动关闭的MessageBox 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

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

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

第一種方法:

[DllImport("user32.dll",?SetLastError=true)]

staticexternIntPtr?FindWindow(stringlpClassName,stringlpWindowName);

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

我根據(jù)這個(gè)思路編寫了延時(shí)關(guān)閉消息對話框的函數(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 ,并將對話框的標(biāo)題和延時(shí)時(shí)間通過CloseState這個(gè)類傳遞給CloseMessageBox函數(shù)。

CloseState 的定義如下:

private class CloseState

{

private int _Timeout;

///

/// In millisecond

///

public int Timeout

{

get

{

return _Timeout;

}

}

private string _Caption;

///

/// Caption of dialog

///

public string Caption

{

get

{

return _Caption;

}

}

public CloseState(string caption, int timeout)

{

_Timeout = timeout;

_Caption = caption;

}

}

最后就是CloseMessageBox函數(shù)了,直接看代碼吧

privatevoidCloseMessageBox(objectstate)

{

????????????CloseState?closeState=stateasCloseState;

????????????Thread.Sleep(closeState.Timeout);

????????????IntPtr?dlg=FindWindow(null,?closeState.Caption);

if(dlg!=IntPtr.Zero)

{

????????????????IntPtr?result;

????????????????EndDialog(dlg,outresult);

????????????}????????}

第二種方法:

//注意提示出現(xiàn)的是、否按鈕 不能自動關(guān)閉

//例如這個(gè)提示就不能自動關(guān)閉:

//if (MessageBox.Show("是否接聽?", "來電:" + num, MessageBoxButtons.YesNo,

//MessageBoxIcon.Asterisk, MessageBoxDefaultButton.Button2) == DialogResult.Yes)

// {}

//以下是源碼

[DllImport("coredll.dll", EntryPoint = "FindWindow", CharSet = CharSet.Auto)]

private extern static IntPtr FindWindow(string lpClassName, string lpWindowName);

[DllImport("coredll.dll", CharSet = CharSet.Auto)]

public static extern int PostMessage(IntPtr hWnd, int msg, IntPtr wParam, IntPtr lParam);

public const int WM_CLOSE = 0x10;

private string _caption;//標(biāo)題名字//在彈出提示窗體,需為這個(gè)變量賦值例如:if (MessageBox.Show("是否接聽?", "來電:" + num, MessageBoxButtons.YesNo,

MessageBoxIcon.Asterisk, MessageBoxDefaultButton.Button2) == DialogResult.Yes)

{}賦值就是:_caption="來電:" + num;//明白

[System.Runtime.InteropServices.DllImport("coredll")]

public static extern bool ShowWindow(IntPtr hwnd, int nCmdShow);//參數(shù):窗體句柄

public const int SW_MINIMIZE = 6;

public static string CodePath = "";

//這個(gè)方法直接調(diào)用就行,直接關(guān)閉當(dāng)前show出的界面,根據(jù)那個(gè)標(biāo)題名字

private void KillMessageBox()

{

try

{

//查找MessageBox的彈出窗口,注意對應(yīng)標(biāo)題

IntPtr ptr = FindWindow(null, this._caption);

if (ptr != IntPtr.Zero)

{

//查找到窗口則關(guān)閉

PostMessage(ptr, WM_CLOSE, IntPtr.Zero, IntPtr.Zero);

}

}

catch (Exception ex)

{

MessageBox.Show("關(guān)閉show"+ex.ToString());

}

}

總結(jié)

以上是生活随笔為你收集整理的java messagebox 关闭_wince/WinForm下实现一个自动关闭的MessageBox的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。