1. 程式人生 > 其它 >C#--訊息篩選實現自動鎖屏功能

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

        }