• 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);
    
            }
    

      

     

     

  • 相关阅读:
    【Android-功能】Android应用增量更新
    【android-音视频】listview中播放音频,实现音频时长的倒计时,暂停,切换。
    Mysql中的DQL查询语句
    DDL、DML和DCL的理解
    WIN2000 XP 2003系统密码破解方法
    ASP.NET开发学习视频教程大全(共800集)
    VS2010中,无法嵌入互操作类型“……”,请改用适用的接口的解决方法
    正则表达式-RegExp-常用正则表达式
    20151216
    20151124-数据类型
  • 原文地址:https://www.cnblogs.com/baozi789654/p/15714397.html
Copyright © 2020-2023  润新知