2010-11-08 5 views
0

Мне было интересно, знает ли кто-нибудь, как использовать диалоговое окно для создания события кнопки удержания. Здесь находится scencio:C# Выключение системы после удержания да в течение 5 секунд

пользователь хотел бы выключить свою систему, но поскольку важно, чтобы они подтвердили, что пользователь должен удерживать кнопку в течение 5 секунд, прежде чем действие может быть выполнено.

Я пытаюсь сделать это в сценарии да нет.

Для подтверждения выключения удерживайте «Да» в течение 5 секунд.

Кто-нибудь сделал это, прежде чем смог предложить небольшую помощь/прозрение?

+1

Это звучит очень плохая идея. Во-первых, потому что вы не должны прерывать выключение системы, поскольку это может произойти из-за удаленного запроса на завершение работы, и нет простого оператора для ответа Да. И во-вторых, потому что идея 5-секундного удержания - это просто неправильно. Как бы пользователь держал Да, если у него только клавиатура? В худшем случае попросите пользователя ввести «Да» в текстовое поле. –

+2

@Remus Rusanu - Я думаю, он пытается инициировать выключение, а не прерывать/прерывать его, и я не знаю, что это такая плохая идея ....это то, как многие люди отключили свои мобильные устройства. – AGoodDisplayName

+0

Чтобы инициировать завершение работы системы, я согласен, что это нормально, но такой механизм приложения будет бесполезен, поскольку существует множество способов ОС для пользователя, чтобы инициировать выключение, которое обходит это подтверждение (запуск/завершение работы, запуск shutdown.exe , Setup/msi reboot, кто-то вызывает Win32Shutdown на WMI, приложения, вызывающие 'InitiateShutdown' и т. Д. И т. Д.). –

ответ

0

Зачем беспокоиться, когда вы можете просто использовать 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

2

Конечно, обращайтесь как с событием mousedown, так и с событием mouseup. Начните таймер в мульдауне и посмотрите, как долго он запускается на мыши. Готово!

+0

Что делать, если пользователь удерживает кнопку дольше? Должна ли она просто ждать, пока они освободятся, чтобы определить, запускать ли выключение или делать это, как только прошло 5 секунд до срабатывания мыши? – jball

+0

Это зависит от того, как вы хотите обработать процесс останова. Если цель состоит в том, чтобы дождаться, когда пользователь отпустит кнопку, а затем измеряет прошедшее время, просто сделайте это, как описано выше. Если вы хотите дождаться, когда пользователь будет удерживать кнопку ровно пять секунд, затем выключите систему, запустите таймер и обработайте выключение в событии таймера Tick. Преждевременная мышка могла бы остановить и снова сбросить таймер. Это должно решить вашу проблему. – Pedery

0

Вы можете использовать события Form.MouseDown, чтобы обнаружить, что пользователь нажал кнопку мыши. В обработчике события проверьте, находится ли курсор над кнопкой или нет (событие передается в координатах курсора). Затем вы можете включить таймер, который будет галочкой в ​​течение 5 секунд, и выполнить выключение при таймере.

0

Когда пользователь сначала нажимает кнопку «ДА», запустите таймер, который многократно проверяет, находится ли указатель мыши внутри кнопки. По истечении 5 секунд продолжите работу. Если пользователь вытащил мышь из кнопки, остановите таймер.

4

Вы можете захватить кнопку нажатием кнопки «mousedown» и запустить 5-секундный таймер. По завершении таймера начинается выключение. Если происходит событие «mouseup», оно может остановить и сбросить таймер.

5

Пробуйте использовать 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; 
    } 
+1

Хорошо, но вы не могли бы установить интервал до 5 секунд; и выключение, когда таймер галочки один раз? – GendoIkari

+0

@ Gendolkari - да, вы могли бы :) - прошло некоторое время с WinForms. Ред. – Inisheer

+0

Кроме того, вы не проверяете, действительно ли пользователь нажимает кнопку. Это отключится через 5 секунд независимо от того, где пользователь нажимает. – GendoIkari

1

Вы можете сделать это несколькими способами. Первое, что приходит мне на ум, состояло в том, чтобы открутить поток, который ждет 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; 
     } 
    } 

Низкие накладные расходы, и вы не добавляете дополнительные элементы управления для чего-то такого простого.

0
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!"); 
} 
0

Вы можете установить таймер на событии MouseDown, и если изменения захвата мышей (проверьте событие MouseCaptureChanged) к ложному перед срабатыванием таймера событий, отменить таймер.