C#--訊息篩選實現自動鎖屏功能
阿新 • • 發佈:2021-12-21
以下是學習筆記
分析:
呼叫自動鎖屏: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); }