Увеличение таймера обратного отсчета при взаимодействии?

У меня есть форма, которую я хочу закрыть через 5 секунд, если не выполняется взаимодействие с мышью, но если выполняется какое-либо взаимодействие с мышью, я хочу, чтобы она закрывалась countdown + 5 seconds, и каждое взаимодействие увеличивало ее на 5 секунд.

Вот что я придумал до сих пор:

int countdown = 5;
System.Timers.Timer timer;

Запустить таймер

timer = new System.Timers.Timer(1000);
timer.AutoReset = true;
timer.Elapsed += new System.Timers.ElapsedEventHandler(ProcessTimerEvent);
timer.Start();

Событие

private void ProcessTimerEvent(Object obj, System.Timers.ElapsedEventArgs e)
{
    --countdown;
    if (countdown == 0)
    {
        timer.Close();
        this.Invoke(new Action(() => { this.Close(); }));
    }
}

И только для тестирования я использую событие мыши формы, чтобы увеличить обратный отсчет на 5, но мне придется изменить его на другое событие, потому что, если вы нажмете на метку или любой другой элемент управления в форме, это не увеличит таймер.

private void NotifierTest_MouseClick(object sender, MouseEventArgs e)
{
    countdown += 5;
}

Вопросы

  • Я реализую обратный отсчет, где счетчик можно правильно увеличить?

  • Должен ли я что-то изменить?

  • Как бы вы это сделали, если бы что-то отличалось от того, что сделал я?

  • Как мне обрабатывать захват щелчка мыши?

  • Использование крюка низкого уровня?

  • Используя положение щелчка мыши и проверьте, было ли оно на моей winform?

Другой вариант

Другой вариант, о котором я сейчас думаю, - это зафиксировать, находится ли мышь в области формы или нет, и включить / отключить обратный отсчет закрытия, если она не находится в области, но я не уверен, как взаимодействовать с мышью для этого, поэтому выше вопросы о том, как я буду взаимодействовать с мышью.


person Prix    schedule 25.04.2011    source источник
comment
Итак, если они щелкают 10 раз быстро, вы хотите, чтобы форма оставалась открытой в течение 50 секунд после того, как они прекратили щелкать? Не знаю, зачем тебе это. Я был бы сбит с толку как пользователь, если бы не было какого-то индикатора выполнения, который заполнялся бы больше при каждом нажатии и медленно истощался бы с течением времени.   -  person Justin    schedule 25.04.2011
comment
@Justin, это то, что произойдет, приведенный выше код в настоящее время делает это, я понимаю, что это не очень элегантно, но я ищу такие варианты, как если бы мышь находилась над формой. Ну, пользователь не будет знать об этом, в основном это что-то вроде того, что если появится уведомление, пользователь посмотрит на него, но он будет взаимодействовать с ним только в том случае, если ему что-то понравилось или нужно, или он нашел интересное, что-то в этом роде.   -  person Prix    schedule 25.04.2011
comment
@Prix, вместо того, чтобы увеличивать countdown += 5, вы можете просто сбросить его, используя countdown = 5, который сбросит его до 5 секунд, а не накапливает при каждом взаимодействии с мышью.   -  person Chris Taylor    schedule 25.04.2011
comment
Я не уверен, что вы ищете справку по коду или предложения по дизайну пользовательского интерфейса... В качестве возможного похожего примера новые уведомления по электронной почте Microsoft Outlook отображаются в виде небольшого поля в углу экрана над панелью задач. , и исчезнет через несколько секунд. Если вы наведете на них указатель мыши, они перестанут исчезать. Я думаю, что тогда они останутся навсегда, но у них есть кнопка закрытия (типичный красный «X»), чтобы закрыть их.   -  person Justin    schedule 25.04.2011
comment
@Justin, это то, что я делаю или пытаюсь сделать, изначально они исчезают или исчезают через 5 секунд, если мышь не находится над ним или с ним не происходит никакого взаимодействия, в настоящее время я переделываю его, чтобы взаимодействовать с мышью, но я я не очень уверен в том, как я должен взаимодействовать с мышью, использование событий winforms для мыши не очень хорошо охватывает элементы управления.   -  person Prix    schedule 25.04.2011
comment
@Chris Taylor Это было потому, что я не хотел, чтобы он выбрасывал оставшиеся несколько секунд, а увеличивал их, но, используя наведение мыши на событие, я мог бы просто сделать это вместо этого.   -  person Prix    schedule 25.04.2011


Ответы (1)


Я думаю, что, по сути, то, что вы делаете, в порядке, настоящий трюк будет заключаться в обработке событий мыши.

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

using System;
using System.Windows.Forms;
using System.Timers;
using System.Drawing;

namespace WinFormsAutoClose
{
  public partial class Form1 : Form
  {
    int _countDown = 5;
    System.Timers.Timer _timer;

    public Form1()
    {
      InitializeComponent();

      _timer = new System.Timers.Timer(1000);
      _timer.AutoReset = true;
      _timer.Elapsed += new ElapsedEventHandler(ProcessTimerEvent);
      _timer.Start();
    }

    private void ProcessTimerEvent(Object obj, System.Timers.ElapsedEventArgs e) 
    {
      Invoke(new Action(() => { ProcessTimerEventMarshaled(); }));
    }

    private void ProcessTimerEventMarshaled()
    {
      if (!IsMouseInWindow())
      {
        --_countDown;
        if (_countDown == 0)
        {
          _timer.Close();
          this.Close();
        }
      }
      else
      {
        _countDown = 5;
      }
    }

    private bool IsMouseInWindow()
    {
      Point clientPoint = PointToClient(Cursor.Position);
      return ClientRectangle.Contains(clientPoint);
    }
  }
}
person Chris Taylor    schedule 25.04.2011
comment
частично это то, что я сейчас пытаюсь сделать, но вместо того, чтобы выполнять событие таймера, я пытаюсь создать событие Mouse Over, которое запустит или не запустит таймер обратного отсчета в зависимости от того, находится ли мышь в форме или нет, но используя параметры winforms когда я убираю мышь из него, он не будет захватывать событие, поэтому я предполагаю, что мне придется захватывать мышь еще где я прав? - person Prix; 25.04.2011
comment
@Prix, использование событий MouseOver, MouseEnter, MouseLeave может быть проблематичным, если в форме есть другие элементы управления, потому что эти элементы управления будут поглощать события мыши до того, как форма получит их при определенных обстоятельствах. Вот почему я решил проверить положение мыши относительно формы на экране грубой силой, которая полностью не зависит от элементов управления в форме. - person Chris Taylor; 25.04.2011
comment
да, мой плохой, я только что заметил это сейчас, работает как шарм, очень ценю ваше время и помощь. - person Prix; 25.04.2011