निम्नलिखित दृष्टिकोण का प्रयास करें:
AutoClosingMessageBox.Show("Text", "Caption", 1000);
जहां AutoClosingMessageBox
कक्षा निम्नलिखित के रूप में लागू की गई है:
public class AutoClosingMessageBox {
System.Threading.Timer _timeoutTimer;
string _caption;
AutoClosingMessageBox(string text, string caption, int timeout) {
_caption = caption;
_timeoutTimer = new System.Threading.Timer(OnTimerElapsed,
null, timeout, System.Threading.Timeout.Infinite);
using(_timeoutTimer)
MessageBox.Show(text, caption);
}
public static void Show(string text, string caption, int timeout) {
new AutoClosingMessageBox(text, caption, timeout);
}
void OnTimerElapsed(object state) {
IntPtr mbWnd = FindWindow("#32770", _caption);
if(mbWnd != IntPtr.Zero)
SendMessage(mbWnd, WM_CLOSE, IntPtr.Zero, IntPtr.Zero);
_timeoutTimer.Dispose();
}
const int WM_CLOSE = 0x0010;
[System.Runtime.InteropServices.DllImport("user32.dll", SetLastError = true)]
static extern IntPtr FindWindow(string lpClassName, string lpWindowName);
[System.Runtime.InteropServices.DllImport("user32.dll", CharSet = System.Runtime.InteropServices.CharSet.Auto)]
static extern IntPtr SendMessage(IntPtr hWnd, UInt32 Msg, IntPtr wParam, IntPtr lParam);
}
अद्यतन:
यदि आप अंतर्निहित मैसेजबॉक्स का रिटर्न वैल्यू प्राप्त करना चाहते हैं जब उपयोगकर्ता टाइमआउट से पहले कुछ का चयन करता है तो आप इस कोड के निम्नलिखित संस्करण का उपयोग कर सकते हैं:
var userResult = AutoClosingMessageBox.Show("Yes or No?", "Caption", 1000, MessageBoxButtons.YesNo);
if(userResult == System.Windows.Forms.DialogResult.Yes) {
}
...
public class AutoClosingMessageBox {
System.Threading.Timer _timeoutTimer;
string _caption;
DialogResult _result;
DialogResult _timerResult;
AutoClosingMessageBox(string text, string caption, int timeout, MessageBoxButtons buttons = MessageBoxButtons.OK, DialogResult timerResult = DialogResult.None) {
_caption = caption;
_timeoutTimer = new System.Threading.Timer(OnTimerElapsed,
null, timeout, System.Threading.Timeout.Infinite);
_timerResult = timerResult;
using(_timeoutTimer)
_result = MessageBox.Show(text, caption, buttons);
}
public static DialogResult Show(string text, string caption, int timeout, MessageBoxButtons buttons = MessageBoxButtons.OK, DialogResult timerResult = DialogResult.None) {
return new AutoClosingMessageBox(text, caption, timeout, buttons, timerResult)._result;
}
void OnTimerElapsed(object state) {
IntPtr mbWnd = FindWindow("#32770", _caption);
if(mbWnd != IntPtr.Zero)
SendMessage(mbWnd, WM_CLOSE, IntPtr.Zero, IntPtr.Zero);
_timeoutTimer.Dispose();
_result = _timerResult;
}
const int WM_CLOSE = 0x0010;
[System.Runtime.InteropServices.DllImport("user32.dll", SetLastError = true)]
static extern IntPtr FindWindow(string lpClassName, string lpWindowName);
[System.Runtime.InteropServices.DllImport("user32.dll", CharSet = System.Runtime.InteropServices.CharSet.Auto)]
static extern IntPtr SendMessage(IntPtr hWnd, UInt32 Msg, IntPtr wParam, IntPtr lParam);
}
फिर भी एक और अद्यतन
मैंने YesNo
बटन के साथ @ जैक के मामले की जांच की है और पाया है कि WM_CLOSE
संदेश भेजने के साथ दृष्टिकोण बिल्कुल भी काम नहीं करता है।
मैं अलग आटोक्लासिंगमेसेज़बॉक्स लाइब्रेरी के संदर्भ में एक फिक्स प्रदान करूंगा । इस लाइब्रेरी में पुन: डिज़ाइन किया गया दृष्टिकोण है और मेरा मानना है कि किसी के लिए उपयोगी हो सकता है।
यह NuGet पैकेज के माध्यम से भी उपलब्ध है :
Install-Package AutoClosingMessageBox
रिलीज़ नोट्स (v1.0.0.2):
- नए शो (IWin32Owner) एपीआई सबसे लोकप्रिय परिदृश्यों का समर्थन करने के लिए ( # 1 के संदर्भ में );
- नई फैक्टरी () एपीआई मैसेजबॉक्स दिखाने पर पूर्ण नियंत्रण प्रदान करने के लिए;