Перезапустите InActivity Monitor после остановки таймера. - PullRequest
0 голосов
/ 08 июня 2018

У меня есть приложение WinForms, где я использую код в этой следующей публикации, чтобы проверить статус неактивности моего приложения (см. Принятый ответ в сообщении). InActivity в WinForms .Как только приложение достигает неактивности, оно останавливает монитор неактивности.Но затем я хочу перезапустить время, когда пользователь входит в систему.

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

 public static System.Windows.Forms.Timer IdleTimer =null;
    static int MilliSeconds = 60000;
    static void Main(string[] args)
            {
                    f = new GeneStudyForm(true, arguments.SystemTimeOutFolder, arguments.SystemTimeOutFile, StartInActivityMonitor);
                    int x = StartInActivityMonitor();
            }

        public static void StartInActivityMonitor()
        {
            IdleTimer = new Timer();
            LeaveIdleMessageFilter limf = new LeaveIdleMessageFilter();
            Application.AddMessageFilter(limf);
            IdleTimer.Interval = MilliSeconds;    //One minute; change as needed
            Application.Idle += new EventHandler(Application_Idle);
            if (IdleTimer != null)
            {
                MessageBox.Show(IdleTimer.Interval.ToString());
            }
            IdleTimer.Tick += TimeDone;
            IdleTimer.Tag = InActivityTimer.Started;
            MessageBox.Show("starting");
            IdleTimer.Start();
        }

        static private void Application_Idle(object sender, EventArgs e)
                {
                    if (!IdleTimer.Enabled)     // not yet idling?
                        IdleTimer.Start();
                }

                static private void TimeDone(object sender, EventArgs e)
        {
            try
            {
                MessageBox.Show("Stopped");
                IdleTimer.Stop();   // not really necessary
                f.MonitorDirectory();
                f.UpdateInActivityStatus();
                IdleTimer.Tick -= TimeDone;
                Application.Idle -= new EventHandler(Application_Idle);
            }
            catch(Exception ex)
            {
                MessageBox.Show(ex.InnerException + ex.Data.ToString());
            }
        }

Вот мой GeneStudyForm

public partial class GeneStudyForm
{
GeneStudySystemTimeOutIO GeneStudyIO;
        Func<int> StartTimer;
//Passing the StartInActivityMonitor Method as Func Delegate
public GeneStudyForm(bool isStandalone, string TimeOutFolder, string TimeOutFile, System.Func<int> MyMethod)
{
GeneStudyIO = GeneStudySystemTimeOutIO.GetInstance(TimeOutFolder, TimeOutFile);
            UpdateActivityStatus(AppName.GeneStudyStatus, ActivityStatus.Active);
            this.StartTimer = MyMethod;
}

public void UpdateActivityStatus(AppName name, ActivityStatus status)
        {
            if (GeneStudyIO != null)
            {
                GeneStudyIO.WriteToFile(name, status);
            }
        }
        public void MonitorDirectory()
        {
            FileSystemWatcher fileSystemWatcher = new FileSystemWatcher(GeneStudyIO.GetDriectory());
            fileSystemWatcher.NotifyFilter = NotifyFilters.LastWrite;
            fileSystemWatcher.Filter = "*.json";
            fileSystemWatcher.Changed += FileSystemWatcher_Changed;
            fileSystemWatcher.EnableRaisingEvents = true;
        }

        public void UnRegister(FileSystemWatcher fileSystemWatcher)
        {
            fileSystemWatcher.Changed -= FileSystemWatcher_Changed;
        }
// I am writing the inactive status to a file. So this event will fill
        private void FileSystemWatcher_Changed(object sender, FileSystemEventArgs e)
        {
            try
            {
                var root = GeneStudyIO.GetDesrializedJson();
                if (root != null && root.AllApplications != null)
                {
                    var item = root.AllApplications.Any(x => x.Status == ActivityStatus.Active.ToString());
                    if (!item)
                    {
                        if (InActivecount == 0)
                        {
                            GeneStudyAndApplicationCommon.TimeStatus = InActivityTimer.Ended;
                            MessageBox.Show("I am hiding");
                            this.Hide();
                            InActivecount++;
                        }
                    }
                    else
                    {
                        if (GeneStudyAndApplicationCommon.TimeStatus == InActivityTimer.Ended)
                        {
                            MessageBox.Show("I am showing");
                            this.Show();
                            UnRegister(sender as FileSystemWatcher);
                            UpdateActivityStatus(AppName.GeneStudyStatus, ActivityStatus.Active);
                            MessageBox.Show("Updated Status");
                            if (StartTimer != null)
                            {
                                MessageBox.Show("Starting Timer again");
                                if (StartTimer() == -1)
                                {
                                    MessageBox.Show("Couldn't start timer");
                                }
                            }
                        }
                    }
                }
            }
            catch (Exception ex)
            {
                SystemDebugLogLogger.LogException(ex);
            }
        }
}

1 Ответ

0 голосов
/ 08 июня 2018

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

Я создал класс с именем IdleCheck, где я получаю LastUserInput следующим образом

public static class IdleCheck
    {
        [StructLayout(LayoutKind.Sequential)]
        private struct LASTINPUTINFO
        {

            [MarshalAs(UnmanagedType.U4)]

            public int cbSize;

            [MarshalAs(UnmanagedType.U4)]

            public int dwTime;

        }

        [DllImport("user32.dll")]
        private static extern bool GetLastInputInfo(ref LASTINPUTINFO x);
        public static int GetLastInputTime()
        {
            var inf = new LASTINPUTINFO();
            inf.cbSize = Marshal.SizeOf(inf);
            inf.dwTime = 0;

            return (GetLastInputInfo(ref inf)) ? Environment.TickCount - inf.dwTime : 0;
        }
    }

Далее в фактической форме этомой кодЯ использую простое окно сообщения «да нет», чтобы увидеть, можно ли остановить таймер и снова вызвать его при необходимости.Вы можете применить свой собственный механизм блокировки.Я хочу, чтобы время ожидания приложения превышало 20 секунд.Измените его при необходимости.

public partial class Form1 : Form
    {
        Timer timer;
        const int TIMEOUT_DONE = 20000;
        public Form1()
        {
            InitializeComponent();
        }

        private void Form1_Load(object sender, EventArgs e)
        {
            Reset();
        }

        void timer_Tick(object sender, EventArgs e)
        {
            //var ms = TIMEOUT_DONE - IdleCheck.GetLastInputTime();
            if (IdleCheck.GetLastInputTime() > TIMEOUT_DONE)
            {
                DialogResult dialogResult = MessageBox.Show("Sure", "Some Title", MessageBoxButtons.YesNo);
                if (dialogResult == DialogResult.Yes)
                {
                    Stop();
                    Reset();
                }

            }

        }

        public void Reset()
        {
            timer = new Timer();

            timer.Interval = 10000;

            timer.Tick += timer_Tick;

            timer.Start();
        }

        public void Stop()
        {
            timer.Tick -= timer_Tick;
            timer.Stop();
        }

    }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...