【问题标题】:c# Shutdown a system after holding yes for 5 secondsc# 按住yes 5秒后关闭系统
【发布时间】:2010-11-08 21:59:25
【问题描述】:

我想知道是否有人知道如何使用对话框来创建按住按钮事件。场景如下:

用户想关闭他们的系统,但因为他们确认很重要,所以用户必须按住按钮 5 秒钟才能完成操作。

我正在尝试在“是”或“否”的情况下这样做。

要确认关机,请按住“是”5 秒钟。

在能够提供一点帮助/见解之前,有人做过吗?

【问题讨论】:

  • 这听起来是个非常糟糕的主意。首先,因为您不应该中断系统关闭,因为它可能是由于远程关闭请求而发生的,并且没有简单的操作员回答是。其次,因为保持 5 秒的想法是错误的。如果用户只有一个键盘,他将如何持有 Yes?更糟糕的是,要求用户在文本框中输入Yes
  • @Remus Rusanu - 我认为他正在尝试启动关闭,而不是中止/中断它,我不知道这是一个坏主意......这有多少人转关闭他们的移动设备。
  • 我同意启动系统关闭是可以的,但是这样的应用层机制基本上是无用的,因为用户可以通过多种操作系统方式启动关闭,从而绕过此确认(开始/Shutdown,运行 shutdown.exe,Setup/msi reboot,有人在 WMI 上调用 Win32Shutdown,应用程序调用 InitiateShutdown 等)。

标签: c# dialog shutdown


【解决方案1】:

尝试使用按钮的 Mouse_Down 和 Mouse_Up 事件以及计时器(假设您使用的是 WinForms)。

    private void button1_MouseDown(object sender, MouseEventArgs e)
    {
        if (this.timer1.Enabled == false)
        {
            this.timer1.Interval = 5000;
            this.timer1.Enabled = true;
        }
    }

    private void timer1_Tick(object sender, EventArgs e)
    {
        this.timer1.Enabled = false;
        MessageBox.Show("Shutdown!");
    }

    private void button1_MouseUp(object sender, MouseEventArgs e)
    {
        timer1.Enabled = false;
    }

【讨论】:

  • 很好,但你不能把间隔设置为 5 秒吗?并在计时器计时一次时关闭?
  • @ Gendolkari - 是的,你可以 :) - 自从做 W​​inForms 以来已经有一段时间了。已编辑。
  • 另外,您没有检查用户是否真的在点击按钮。无论用户点击哪里,它都会在 5 秒后关闭。
  • @Gendolkari -- 显然该事件将绑定到它的处理程序,在这种情况下,它看起来像是一个按钮。
  • Eww。不良的副作用。澄清 Gendolkari 的声明。如果您单击并按住按钮,并在按住鼠标按钮的同时离开按钮...该事件仍将被触发。可能需要做一些更有创意的编码。
【解决方案2】:

您可以在“mousedown”上捕获按钮按下,并启动一个 5 秒计时器。一旦定时器完成,就会启动关机。如果发生“mouseup”事件,它可能会停止并重置计时器。

【讨论】:

    【解决方案3】:

    当然,处理 mousedown 事件和 mouseup 事件。在 mousedown 上启动一个计时器,看看它在 mouseup 上运行了多长时间。完成!

    【讨论】:

    • 如果用户按住按钮的时间更长怎么办?它应该等到它们释放后再确定是否触发关闭,还是在 mouseup 触发前 5 秒后立即执行?
    • 这取决于您要如何处理关机过程。如果目的是等待用户释放按钮然后测量经过的时间,就像我上面描述的那样做。如果您想等待用户按住按钮恰好五秒钟,然后关闭系统,启动 Timer 并在 timer Tick 事件中处理关闭。然后,过早的 mouseup 可能会停止并再次重置计时器。这应该可以解决您的问题。
    【解决方案4】:

    您可以通过多种方式做到这一点。我首先想到的是分离一个等待 5 秒的线程,如果用户的鼠标重新启动,它就会简单地中止。

        Thread shutdown;
        private void button1_MouseDown(object sender, MouseEventArgs e)
        {
            shutdown = new Thread(()=>ShutDown());
            shutdown.Start();
        }
    
        private void ShutDown()
        {
            Thread.Sleep(5000);
            Console.Write("5 seconds has elapsed");
            // Do something.
        }
    
        private void button1_MouseUp(object sender, MouseEventArgs e)
        {
            if (shutdown != null)
            {
                shutdown.Abort();
                shutdown = null;
            }
        }
    

    低开销,您无需为这么简单的事情添加额外的支持控件。

    【讨论】:

      【解决方案5】:

      当您可以只使用 getAsyncKeyState() 时,为什么还要麻烦呢?告诉他们按住'y' 5 秒钟。你可以在这里找到参考:http://www.pinvoke.net/default.aspx/user32.getasynckeystate

      或者您可以按照自己的方式进行操作,在 MouseDown 上启动计时器,然后在 MouseUp 上,结束计时器,然后查看它是多于还是少于 5 秒。 http://msdn.microsoft.com/en-us/library/system.windows.forms.control.mousedown%28VS.71%29.aspx

      【讨论】:

        【解决方案6】:

        您可以使用 Form.MouseDown 事件来检测用户是否按下了鼠标按钮。在事件处理程序中,检查光标是否在按钮上方(事件在光标的坐标中传递)。然后,您可以启用一个将在 5 秒内计时的计时器,并在计时器计时时执行关机。

        【讨论】:

          【解决方案7】:

          当用户第一次单击“是”时,启动一个计时器,反复检查鼠标位置是否在按钮内。 5 秒后,继续关机。如果用户将鼠标移出按钮,则停止计时器。

          【讨论】:

            【解决方案8】:
            private DateTime mouseDownTime;
            
            private void Button_MouseDown(object sender, MouseButtonEventArgs e)
            {
                mouseDownTime = DateTime.Now;
            }
            
            private void Button_MouseUp(object sender, MouseButtonEventArgs e)
            {
                if (mouseDownTime.AddSeconds(5) < DateTime.Now)
                    MessageBox.Show("You held it for 5 seconds!");
            }
            

            【讨论】:

              【解决方案9】:

              您可以在 MouseDown 事件上设置一个计时器,如果在计时器事件触发之前鼠标捕获更改(检查 MouseCaptureChanged 事件)为 false,则取消计时器。

              【讨论】:

                猜你喜欢
                • 1970-01-01
                • 2015-02-21
                • 2013-01-04
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 2015-03-29
                • 2014-04-05
                • 1970-01-01
                相关资源
                最近更新 更多