Essayez l'approche suivante :
AutoClosingMessageBox.Show("Text", "Caption", 1000);
Où le AutoClosingMessageBox
est mise en œuvre comme suit :
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); // lpClassName is #32770 for MessageBox
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);
}
Mise à jour : Si vous voulez obtenir la valeur de retour de la MessageBox sous-jacente lorsque l'utilisateur sélectionne quelque chose avant le délai d'attente, vous pouvez utiliser la version suivante de ce code :
var userResult = AutoClosingMessageBox.Show("Yes or No?", "Caption", 1000, MessageBoxButtons.YesNo);
if(userResult == System.Windows.Forms.DialogResult.Yes) {
// do something
}
...
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); // lpClassName is #32770 for MessageBox
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);
}
Encore une autre mise à jour
J'ai vérifié le cas de @Jack avec YesNo
et découvert que l'approche consistant à envoyer le WM_CLOSE
Le message ne fonctionne pas du tout.
Je vais fournir un fixer dans le cadre de l'action séparée Boîte à messages autoclave bibliothèque. Cette bibliothèque contient une approche repensée et, je crois, peut être utile à quelqu'un.
Il est également disponible via Paquet NuGet :
Install-Package AutoClosingMessageBox
Notes de mise à jour (v1.0.0.2) :
- Nouvelle API Show(IWin32Owner) pour prendre en charge les scénarios les plus populaires (dans le contexte de #1 ) ;
- Nouvelle API Factory() pour fournir un contrôle total sur l'affichage des MessageBox ;
1 votes
Jetez un coup d'œil à ceci (Windows Phone, mais cela devrait être la même chose) : stackoverflow.com/questions/9674122/
6 votes
@istepaniuk il ne peut pas essayer s'il ne sait pas. donc arrêtez ce genre de questions.
1 votes
Vous devriez pouvoir créer une minuterie et la programmer pour qu'elle se ferme après un laps de temps déterminé.
2 votes
Vous pouvez créer le formulaire en tant que
MessageBox
1 votes
Le code de base dont vous avez besoin est ici : stackoverflow.com/questions/12090691/
1 votes
@Kiquenet - Je dois rétrograder cette question puisque vous ne nous avez même pas montré ce que vous avez essayé.
2 votes
@MustafaEkici, j'invitais le PO à montrer ce qu'il a essayé. Je suppose qu'il a dû essayer et échouer avant de poser la question à l'OS. C'est pourquoi Ramhound et moi-même avons rétrogradé la question. Vous pouvez lire meta.stackexchange.com/questions/122986/