如何实现鼠标停止移动经定时间隔后显示表单,移动时暂停倒计时?
实现鼠标静止延迟显示表单并响应鼠标移动暂停倒计时
要实现鼠标停止移动指定时间后显示锁定表单,鼠标移动时重置倒计时的功能,需要通过CancellationTokenSource控制异步延迟任务,并监听鼠标移动事件来重置计时。以下是完整实现代码:
private CancellationTokenSource _cts; private async void frmMain_Shown(object sender, EventArgs e) { // 窗体显示时启动初始倒计时 await StartCountdownAsync(5000); } private async Task StartCountdownAsync(int interval) { // 取消并清理之前的倒计时任务(如果存在) _cts?.Cancel(); _cts?.Dispose(); // 创建新的任务令牌源 _cts = new CancellationTokenSource(); try { // 等待指定间隔,期间鼠标移动则会取消此任务 await Task.Delay(interval, _cts.Token); // 倒计时完成,弹出锁定表单 using (var f3 = new frm_LockScreen()) { f3.my_EmpID = my_Emp_ID; f3.ShowDialog(); } this.Show(); } catch (TaskCanceledException) { // 倒计时被鼠标移动触发取消,无需额外处理 } finally { _cts.Dispose(); _cts = null; } } private void frmMain_MouseMove(object sender, MouseEventArgs e) { // 鼠标移动时立即重置倒计时 _ = StartCountdownAsync(5000); }
关键逻辑说明
- CancellationTokenSource:用于管控异步延迟任务的生命周期,每次鼠标移动时销毁旧任务、创建新的倒计时,确保计时只针对最后一次鼠标静止状态
- MouseMove事件绑定:需要在窗体设计器或构造函数中绑定该事件,确保鼠标在窗体范围内移动时能触发倒计时重置
- 异常捕获:
TaskCanceledException是倒计时被取消时的正常抛出,仅用于捕获并忽略,避免程序报错
内容的提问来源于stack exchange,提问作者Vicky_Smaith
相关产品推荐
相关产品推荐

