以下是学习笔记
分析:
调用自动锁屏: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); }