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

VB.NET WPF如何获取窗口空闲时间以控制DispatcherTimer执行

VB.NET WPF 实现窗口空闲检测控制DispatcherTimer运行

要实现用户操作时阻止DispatcherTimer运行,仅当窗口空闲超过1分钟才执行刷新逻辑,可以通过监听用户输入事件记录活动时间,结合两个DispatcherTimer分别做空闲检测和刷新操作,具体实现如下:

步骤1:声明变量与计时器

在窗口类中添加以下成员变量,用于记录用户最后活动时间、空闲检测计时器和刷新计时器:

Private lastActivityTime As DateTime = DateTime.Now
' 用于定期检查空闲状态的计时器
Private idleCheckTimer As New DispatcherTimer()
' 你的刷新逻辑计时器
Private refreshTimer As New DispatcherTimer()

步骤2:初始化计时器与事件监听

在窗口的Loaded事件中完成计时器配置,同时监听所有用户输入事件(确保捕获窗口内的任何操作):

Private Sub Window_Loaded(sender As Object, e As RoutedEventArgs) Handles Me.Loaded
    ' 空闲检查计时器:每隔1秒检查一次空闲状态(可根据需求调整间隔)
    idleCheckTimer.Interval = TimeSpan.FromSeconds(1)
    AddHandler idleCheckTimer.Tick, AddressOf IdleCheckTimer_Tick
    
    ' 刷新计时器:设置你需要的刷新间隔(这里和空闲阈值一致,也可按需调整)
    refreshTimer.Interval = TimeSpan.FromMinutes(1)
    AddHandler refreshTimer.Tick, AddressOf dispatcherTimer_Tick
    
    ' 启动空闲检查计时器
    idleCheckTimer.Start()
    
    ' 监听用户输入事件,捕获所有操作
    AddHandler Me.MouseMove, AddressOf UserActivityDetected
    AddHandler Me.MouseDown, AddressOf UserActivityDetected
    AddHandler Me.KeyDown, AddressOf UserActivityDetected
    ' 使用Preview事件确保捕获子控件的操作
    AddHandler Me.PreviewMouseMove, AddressOf UserActivityDetected
    AddHandler Me.PreviewMouseDown, AddressOf UserActivityDetected
    AddHandler Me.PreviewKeyDown, AddressOf UserActivityDetected
End Sub

步骤3:处理用户活动事件

当检测到用户操作时,更新最后活动时间并停止刷新计时器:

Private Sub UserActivityDetected(sender As Object, e As EventArgs)
    lastActivityTime = DateTime.Now
    ' 用户操作时立即停止刷新计时器
    If refreshTimer.IsEnabled Then
        refreshTimer.Stop()
    End If
End Sub

步骤4:空闲状态检查逻辑

在空闲检测计时器的Tick事件中,判断当前空闲时间是否超过1分钟,满足条件则启动刷新计时器:

Private Sub IdleCheckTimer_Tick(sender As Object, e As EventArgs)
    Dim idleDuration As TimeSpan = DateTime.Now - lastActivityTime
    ' 空闲超过1分钟且刷新计时器未运行时,启动刷新
    If idleDuration >= TimeSpan.FromMinutes(1) AndAlso Not refreshTimer.IsEnabled Then
        refreshTimer.Start()
    End If
End Sub

步骤5:保留你的刷新逻辑

继续使用你原有的dispatcherTimer_Tick方法执行DataGridView刷新:

Public Sub dispatcherTimer_Tick(ByVal sender As Object, ByVal e As EventArgs)
   naloziDGV1()
   naloziDGV2()
   naloziDGV3()
End Sub

步骤6:窗口关闭时清理计时器

在窗口Closing事件中停止所有计时器,避免资源泄漏:

Private Sub Window_Closing(sender As Object, e As ComponentModel.CancelEventArgs) Handles Me.Closing
    idleCheckTimer.Stop()
    refreshTimer.Stop()
End Sub

内容的提问来源于stack exchange,提问作者Vlado Stare

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.18 21:01:52