C#消息框 - 自动消失

时间:2011-10-19 16:45:48

标签: c#

我有一个Windows应用程序,它会将一些信息写入卡的Track1和Track2。现在我想要完成的是,当用户点击按钮时,一旦用户刷卡以使消息框消失,消息框就会出现“等待刷卡”。

我尝试使用do while循环但是它不会看到我正在调用的函数

例如:

do{
readcard();
}while (messagebox.show());

这根本不起作用。关于如何实现这一目标的任何建议。

由于

3 个答案:

答案 0 :(得分:1)

MessageBox.Show显示一个消息框并等待用户将其解除。

如果要显示不等待用户但是以编程方式控制的内容,则需要自己编写。在Windows窗体中,您可以使用winforms设计器创建Form,在实例上调用Show以显示它,然后Hide以隐藏它

然而,Windows应用程序和在过去10年或20年内编写的任何应用程序都是事件驱动的,因此如果用户参与其中你不应该使用这样的循环(使用while)。

退房: http://en.wikipedia.org/wiki/Event-driven_programming http://dotnetfirez.blogspot.com/2010/05/winforms.html https://softwareengineering.stackexchange.com/questions/99842/vs2010-winform-designer-to-learn-or-bottom-up-approach

和谷歌的起点。

答案 1 :(得分:0)

  • 创建一个基本的小尺寸表单。添加标签并在那里输入您的信息。将表格的起始位置属性设为中心

  • 调用表单实例

    AutomaticDisappearPopup pop = new AutomaticDisappearPopup();        
    pop.Show();
    WaitSomeTime(pop);
    
  • 为显示时间定义waitSomeTime方法,然后在不中断主线程的情况下消失

    public async void WaitSomeTime(Form item)
    {
        await Task.Delay(3000);
        item.Close();
    }
    

答案 2 :(得分:0)

最近我为 TopMost 消息框创建了一个包装器,它可以在使用 WinForms MessageBox 一段时间后消失(也可用于 WPF)。

using System;
using System.Diagnostics;
using System.Threading.Tasks;
using System.Windows.Forms;
using MessageBox = System.Windows.Forms.MessageBox;
using Size = System.Drawing.Size;
using System.Runtime.InteropServices;

namespace Views
{
    public class TopMostMessageBox
    {
        const int WM_CLOSE = 0x10;
        
        [System.Runtime.InteropServices.DllImport("user32.dll", CharSet = System.Runtime.InteropServices.CharSet.Auto)]
        public static extern IntPtr SendMessage(IntPtr hWnd, UInt32 Msg, IntPtr wParam, IntPtr lParam);

        public static DialogResult Show(string message, string title = null, MessageBoxButtons buttons = MessageBoxButtons.OK, MessageBoxIcon messageBoxIcon = MessageBoxIcon.None, int timeoutSeconds = -1, bool topMost = true )
        {
            title = title ?? String.Empty;
            Form timeoutMessageBox = CreateAutoCloseWindow(timeoutSeconds, topMost);

            return MessageBox.Show(timeoutMessageBox, message, title, buttons, messageBoxIcon);
        }
        
        private static Form CreateAutoCloseWindow(int timeoutSeconds, bool isTopMost = false)
        {
            var w = new Form() { Size = new Size(0, 0), TopMost = isTopMost};

            int timeoutMs =(timeoutSeconds == -1) ? -1 : (timeoutSeconds*1000);

            Task.Delay(timeoutMs).ContinueWith(
                t => ControlInvoke(w, () => SendMessage(w.Handle, WM_CLOSE, IntPtr.Zero, IntPtr.Zero)));

            return w;
        }
        
        public static void ControlInvoke(System.Windows.Forms.Control control, Action action) //in case you work with multiple threads
        {
            try
            {
                if (control == null || action ==null) return;

                if (control.InvokeRequired) control.Invoke(new System.Windows.Forms.MethodInvoker(delegate { action(); }));
                else action();
            }
            catch (Exception e)
            {
                Debug.WriteLine($"InvokeSelfFixedException: {e}");
            }
        }
    }
}

然后就打电话

TopMostMessageBox.Show("This is TOP_MOST messagebox text", "TOP_MOST title", MessageBoxButtons.OK, MessageBoxIcon.Warning);