C#消息筛选实现自动锁屏功能

以下是学习笔记

分析:

调用自动锁屏:user32.dll

检测:自动更新的计时器,对某个数值变量进行自增和判断,如果相等执行锁屏。

无动作:鼠标和键盘无操作,消息筛选,捕捉到鼠标键盘操作就清零。

1,windows锁屏API:LockWorkStation

        #region 【自动锁屏步骤1】引用user32.dll实现消息筛选器实现系统自动锁屏的方法

        [DllImport("user32.dll")]
        public static extern bool LockWorkStation();

        //创建消息筛选器对象
        private MessageFilter messageFilter;

        //消息筛选器
        internal class MessageFilter : IMessageFilter
        {
            public bool PreFilterMessage(ref Message m)
            {
                //如果检测到有鼠标或键盘的消息,则使计数为0
                if (m.Msg == 0x0200 || m.Msg == 0x0201 || m.Msg == 0x0204 || m.Msg == 0x0207)
                {
                    GlobalVariable.TickCount = 0;
                }

                return false;
            }
        }

        #endregion

 

全局变量:

namespace AutomaticStoreMotionModels
{
    /// <summary>
    /// 全局变量类
    /// </summary>
   public  class GlobalVariable
    {
        /// <summary>
        /// 用户对象
        /// </summary>
        public static SysAdmin SysAdmin;

        /// <summary>
        /// 静态的复位委托
        /// </summary>
        public static Action SystemReset;

        /// <summary>
        /// 系统锁屏计数器
        /// </summary>
        public static int TickCount = 0;
    }
}

 

 

2,创建更新定时器

        public FrmMain()
        {
            InitializeComponent();

            //更新的定时器
            UpdateTimer.Interval = 200;
            UpdateTimer.Tick += UpdateTimer_Tick;
            UpdateTimer.Enabled = true;

            //窗体事件
            this.Load += FrmMain_Load;

        }

 

        #region【自动锁屏步骤2】 更新定时器的事件处理

        //创建定时器
        private Timer UpdateTimer = new Timer();

        private void UpdateTimer_Tick(object sender, EventArgs e)
        {
            //更新位置
            if (motionEx.initialOK)
            {
                SetPos(motionEx.GetCmdPos());
            }

            //更新时间
            this.lbl_time.Text = CurrentTime;

            //计算时间,系统锁屏功能
            if (motionEx.basicParameter.AutoLock > 0)//如果系统设置自动锁屏时间大于0
            {
                GlobalVariable.TickCount++;//全局变量计数+1

                //如果计时达到系统锁屏时间
                if (GlobalVariable.TickCount == 1000 / UpdateTimer.Interval * motionEx.basicParameter.AutoLock)//1000ms除以计时器间隔(这里间隔是200ms)
                {
                    //执行锁屏
                    LockWorkStation();
                }
            }
        }



        #endregion

  

3,初始化消息筛选器,向Windows传送

        private void FrmMain_Load(object sender, EventArgs e)
        {


            #region【自动锁屏步骤3】 初始化消息筛选器,向Windows传送

            if (motionEx.basicParameter.AutoLock > 0)
            {
                messageFilter=new MessageFilter();
                //添加消息筛选器以便在向目标传送  Windows  消息时监视这些消息。
                Application.AddMessageFilter(messageFilter);
            }

            #endregion


        }

 

4,从应用程序的消息泵移除一个消息筛选器

        private void FrmMain_FormClosing(object sender, FormClosingEventArgs e)
        {

            // 【自动锁屏步骤4】从应用程序的消息泵移除一个消息筛选器。如果不释放会造成很严重的内存泄漏。
            Application.RemoveMessageFilter(messageFilter);

        }

  

 

 

原文地址:https://www.cnblogs.com/baozi789654/p/15714397.html