el_tot93 Ответов: 3

C# выйти из приложения


как выйти из приложения, если пользователь не использует его, если он использует его все еще открытым для подола

Что я уже пробовал:

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

private void Form1_Load(object sender, EventArgs e)
      {
          IdleTimer.Tick += new EventHandler(IdleTimer_Tick);
      }

      void Application_Idle(object sender, EventArgs e)
      {
          if (!IdleTimer.Enabled)
          {
              StartTimer();
          }
      }

      private void StartTimer()
      {
          IdleTimer.Interval = (Int32)((60000.0D) * (0.2D));
          IdleTimer.Enabled = true;
          Debug.WriteLine("Timer Started : " + IdleTimer.Interval.ToString());
          IdleTimer.Start();
      }

      void IdleTimer_Tick(object sender, EventArgs e)
      {
          IdleTimer.Enabled = false;
          // Some cleanup code
          // ....
          // ....
          Application.Exit(); // Or something like this
      }

      private void Form1_MouseMove(object sender, MouseEventArgs e)
      {
          RestartTimer();
      }

      private void Form1_KeyDown(object sender, KeyEventArgs e)
      {
          RestartTimer();
      }

      private void StopTimer()
      {
          Debug.WriteLine("Stopping Timer.");
          IdleTimer.Enabled = false;
          IdleTimer.Stop();
      }

      private void RestartTimer()
      {
          StopTimer();
          StartTimer();
      }


что не так с этим кодом ??

CPallini

- попробуй сделать таймер обратного отсчета, но он не сработал"
Просьба представить подробную информацию.

el_tot93

я должен обновить его

PIEBALDconsult

Это то, чего хочет пользователь?

el_tot93

да

3 Ответов

Рейтинг:
5

el_tot93

1 - добавить таймер на форму.

2-Добавьте этот метод в свой класс формы.

public static uint GetIdleTime()
{
     LASTINPUTINFO LastUserAction = new LASTINPUTINFO();
     LastUserAction.cbSize = 
(uint)System.Runtime.InteropServices.Marshal.SizeOf(LastUserAction);
     GetLastInputInfo(ref LastUserAction);
     return ((uint)Environment.TickCount - LastUserAction.dwTime);
}

3 - в Form_Load запустите таймер:

timer1.Start();

4 - в события Tick таймера проверить GetIdleTime

private void timer1_Tick(object sender, EventArgs e)
{
    if (GetIdleTime() > 1200000 )  // 20minutes
       Application.Exit();//For Example
}


<pre lang="c#">using System.Runtime.InteropServices;

[DllImport("User32.dll")]
private static extern bool GetLastInputInfo(ref LASTINPUTINFO plii);   

internal struct LASTINPUTINFO
{
    public uint cbSize;

    public uint dwTime;
}


Рейтинг:
22

OriginalGriff

Добавить а Timer экземпляр к приложению, установите его в Interval 1000 (одна секунда).
Справьтесь с этим Tick событие.
Добавление уровня класса DateTime, называемый closeAt, и написать частный метод под названием Tickle. Внутри метода установите closeAt к DateTime.Now.AddMinutes(numberOfMinutesToIdleBeforeClosing)
Внутри дома Timer Tick метод обработчика, сравнение closeAt к течению Тэ DateTime Если он больше, используйте Приложения.Выход[^] чтобы закрыть приложение.
Теперь все, что вам нужно сделать, это решить, что такое "пользователь не использует его", и позвонить Tickle всякий раз, когда он делает что-то, что представляет собой "использование" приложения!


el_tot93

можете ли вы объяснить это в коде, если у вас есть время

OriginalGriff

Объясните, что именно?
Помните, я не знаю, что вы делаете или не знаете - я только получаю точно то, что вы печатаете для работы.

Итак: вы создали экземпляр таймера?

el_tot93

Послушайте я новичок в кодировании поэтому не знаю что мне делать

OriginalGriff

Итак, вы не знаете, как создать экземпляр таймера?
А почему бы и нет? Если вы работаете с подобными вещами, вам нужно сначала знать основы. И мы не можем научить вас этому, вот для чего вы находитесь на своем курсе!

el_tot93

проверьте сейчас

OriginalGriff

Прочитайте то, что я сказал еще раз: ваша версия убьет приложение через 12 секунд ...
И почему, черт возьми, вы используете 2 десятичных значения для получения целочисленного результата? Используйте целые числа!

el_tot93

Бездельник.Интервал = (Int)((120000); ??

OriginalGriff

:вздыхать:
Бездельник.Интервал = (Int32)((60000.0 D) * (0.2 D));
Это одна пятая от 60 000 = = 12 000 == двенадцати секунд.
(Int)((120000);
1) не будет компилироваться.
2) скобки вокруг числа не нужны.
3) 120000 уже является целым числом, поэтому вам вообще не нужно его разыгрывать.
4) 120 000-это 120 секунд или две минуты. Поэтому, несмотря ни на что, ваш код закроет ваше приложение через две минуты.

Прочтите, что я сказал ...

Рейтинг:
14

CPallini

Я полагаю, что другие уже задавали подобный вопрос, см., например: Автоматическое Завершение Работы Приложения[^].