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

浙公网安备 33010602011771号