You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何实现鼠标停止移动经定时间隔后显示表单,移动时暂停倒计时?

实现鼠标静止延迟显示表单并响应鼠标移动暂停倒计时

要实现鼠标停止移动指定时间后显示锁定表单,鼠标移动时重置倒计时的功能,需要通过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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.05 13:48:11