MonitorMouseKeyboard.cs 2.0 KB
using System;
using System.Collections.Generic;
using System.Threading;
using System.Windows.Forms;

namespace BLL
{
    public class MonitorMouseKeyboard : IMessageFilter
    {
        public event EventHandler Timeout;

        private bool loop;
        private DateTime startTime;
        private readonly List<int> message = new() {
            0x0100,  //按下键盘某键
            0x0101,  //释放键盘某键
            0x0200,  //鼠标移动
            0x0201,  //按下鼠标左键
            0x0202,  //释放鼠标左键
            0x0204,  //按下鼠标右键
            0x0205,  //释放鼠标右键
            0x0207,  //按下鼠标中键
            0x0208,  //释放鼠标中键
            0x020A   //当鼠标滚轮转动时
        };

        public bool Pause { set; get; } = false;

        public bool PreFilterMessage(ref Message m)
        {
            int msg = m.Msg;
            int index = message.FindIndex(match => msg == match);
            if (index > -1) startTime = DateTime.Now;
            return false;
        }

        public void Start(int second)
        {
            loop = true;
            startTime = DateTime.Now;
            new Thread(new ParameterizedThreadStart(Counting)).Start(second);
        }

        public void Stop()
        {
            loop = false;
        }

        /// <summary>
        /// 计时线程
        /// </summary>
        /// <param name="obj"></param>
        private void Counting(object obj)
        {
            int ms = (int)obj * 1000;
            
            while (loop)
            {
                Thread.Sleep(100);
                if (Pause) continue;
                if (!loop) break;

                double mSec = (DateTime.Now - startTime).TotalMilliseconds;
                if (mSec >= ms)
                {
                    System.Threading.Tasks.Task.Run(() =>  Timeout?.Invoke(this, EventArgs.Empty));
                    loop = false;
                }
            }
        }
    }
}