自动注销vb.net

自动注销vb.net,vb.net,winforms,timer,Vb.net,Winforms,Timer,我正在尝试为我的vb.net桌面应用程序实现自动注销功能。代码如下: Private Sub AutoLogOffTimer(ByVal myUIContext As globals) If myUIContext.parameters.LogOutTime <> 0 Then myTimer = New System.Windows.Forms.Timer() myTimer.Enabled = False

我正在尝试为我的vb.net桌面应用程序实现自动注销功能。代码如下:

Private Sub AutoLogOffTimer(ByVal myUIContext As globals)

         If myUIContext.parameters.LogOutTime <> 0 Then
            myTimer = New System.Windows.Forms.Timer()
            myTimer.Enabled = False
            'myTimer.Dispose()
            myTimer.Interval = (myUIContext.parameters.LogOutTime * 60 * 1000) - 20000
            AddHandler myTimer.Tick, AddressOf logOutUser
            myTimer.Start()
            Application.AddMessageFilter(Me)
         ElseIf myUIContext.parameters.LogOutTime = 0 Then
            Application.RemoveMessageFilter(Me)
            RemoveHandler myTimer.Tick, AddressOf logOutUser
            myTimer.Stop()
            myTimer.Enabled = False
         End If
      End Sub

 Public Function PreFilterMessage(ByRef m As Message) As Boolean Implements    IMessageFilter.PreFilterMessage

         ' Monitor message for keyboard and mouse messages
         Dim active As Boolean = m.Msg = &H100 OrElse m.Msg = &H101
         ' WM_KEYDOWN/U
         'active = active OrElse m.Msg = &HA0 ' OrElse m.Msg = &H200
         active = active OrElse m.Msg = &HA3 OrElse m.Msg = &H201 OrElse m.Msg = &H202 OrElse m.Msg = &H1 OrElse m.Msg = &H200 OrElse m.Msg = &H2 OrElse m.Msg = &H208 OrElse m.Msg = &H2A3 OrElse m.Msg = &H2A1
         ' WM_(NC)MOUSEMOVE
         active = active OrElse m.Msg = &H10 OrElse m.Msg = &H3 OrElse m.Msg = &H5
         ' WM_CLOSE, in case dialog closes
         If active Then
            myTimer.Enabled = False
            myTimer = New System.Windows.Forms.Timer()
            If _myUIContext.parameters.LogOutTime <> 0 Then
               myTimer.Interval = (_myUIContext.parameters.LogOutTime * 60 * 1000) - 20000
               Try
                  RemoveHandler myTimer.Tick, AddressOf logOutUser
               Catch ex As Exception
               End Try
               AddHandler myTimer.Tick, AddressOf logOutUser
               myTimer.Start()
               myTimer.Enabled = True
            ElseIf _myUIContext.parameters.LogOutTime = 0 Then
               myTimer = New System.Windows.Forms.Timer()
               myTimer.Stop()
            End If
         End If
         Return False
      End Function

 Private Sub logOutUser(ByVal sender As Object, ByVal e As EventArgs)

         If Not isLogoutWindowOpen Then
            If ComputeCpuUsage() < 1 Then
               LogoutWindow = New LogoutApp(20)
               AddHandler LogoutWindow.logOutCancel, AddressOf logOutCancel
               AddHandler LogoutWindow.logOutProceed, AddressOf logOutProceed

               LogoutWindow.MdiParent = Me
               LogoutWindow.Show()
               myTimer.Stop()

               isLogoutWindowOpen = True
            Else
               myTimer.Enabled = False
               myTimer.Start()
            End If

         End If

      End Sub

  Private Sub logOutCancel()

         myTimer = Nothing
         myTimer = New System.Windows.Forms.Timer()
         myTimer.Enabled = False
         myTimer.Stop()
         If _myUIContext.parameters.LogOutTime <> 0 Then
            myTimer.Interval = (_myUIContext.parameters.LogOutTime * 60 * 1000) - 20000
            myTimer.Start()
         End If
         myTimer.Enabled = True
         isLogoutWindowOpen = False
      End Sub
Private Sub AutoLogOffTimer(ByVal myUIContext作为全局变量)
如果myUIContext.parameters.LogOutTime为0,则
myTimer=New System.Windows.Forms.Timer()
myTimer.Enabled=False
'myTimer.Dispose()
myTimer.Interval=(myUIContext.parameters.LogOutTime*60*1000)-20000
AddHandler myTimer.Tick,logOutUser的地址
myTimer.Start()
Application.AddMessageFilter(Me)
ElseIf myUIContext.parameters.LogOutTime=0,则
Application.RemoveMessageFilter(Me)
RemoveHandler myTimer.Tick,logOutUser的地址
myTimer.Stop()
myTimer.Enabled=False
如果结束
端接头
作为布尔值的公共函数PreFilterMessage(ByRef m作为消息)实现IMessageFilter.PreFilterMessage
'键盘和鼠标消息的监视消息
Dim活动为布尔值=m.Msg=&H100或LSE m.Msg=&H101
“WM_键控/U
'主动=主动OrElse m.Msg=&HA0'主动OrElse m.Msg=&H200
active=active OrElse m.Msg=&HA3 OrElse m.Msg=&H201 OrElse m.Msg=&H202 OrElse m.Msg=&H1 OrElse m.Msg=&H200 OrElse m.Msg=&H208 OrElse m.Msg=&H2A3 OrElse m.Msg=&H2A1
'WM_u0;(NC)鼠标移动
活动=活动OrElse m.Msg=&H10 OrElse m.Msg=&H3 OrElse m.Msg=&H5
“WM_关闭,以防对话框关闭
如果激活,则
myTimer.Enabled=False
myTimer=New System.Windows.Forms.Timer()
如果_myUIContext.parameters.LogOutTime为0,则
myTimer.Interval=(_myUIContext.parameters.LogOutTime*60*1000)-20000
尝试
RemoveHandler myTimer.Tick,logOutUser的地址
特例
结束尝试
AddHandler myTimer.Tick,logOutUser的地址
myTimer.Start()
myTimer.Enabled=True
ElseIf_myUIContext.parameters.LogOutTime=0,则
myTimer=New System.Windows.Forms.Timer()
myTimer.Stop()
如果结束
如果结束
返回错误
端函数
私有子logOutUser(ByVal发送方作为对象,ByVal e作为事件参数)
如果不是isLogoutWindowOpen,则
如果ComputeCpuUsage()<1,则
LogoutWindow=新的LogoutApp(20)
AddHandler LogoutWindow.logOutCancel,logOutCancel的地址
AddHandler LogoutWindow.LogoutProcedure,LogoutProcedure的地址
LogoutWindow.MdiParent=Me
LogoutWindow.Show()
myTimer.Stop()
isLogoutWindowOpen=True
其他的
myTimer.Enabled=False
myTimer.Start()
如果结束
如果结束
端接头
私有子登录取消()
myTimer=无
myTimer=New System.Windows.Forms.Timer()
myTimer.Enabled=False
myTimer.Stop()
如果_myUIContext.parameters.LogOutTime为0,则
myTimer.Interval=(_myUIContext.parameters.LogOutTime*60*1000)-20000
myTimer.Start()
如果结束
myTimer.Enabled=True
isLogoutWindowOpen=False
端接头
问题是,当我将注销时间设置为1分钟时,如果在1分钟后我不在应用程序上执行任何操作,那么它可以正常工作,并在1分钟后为我提供注销窗口。但在我取消注销窗口消息并开始处理我的应用程序后,注销消息框会随意出现。首先,我认为我的计时器没有正确重置,但myTimer.Enabled=False应该执行此操作,如果没有,myTimer.start()肯定会执行此操作,但这似乎也不起作用。我已经检查了我的预过滤邮件,但仍然没有运气

任何帮助都将不胜感激


谢谢。

好的,我想我可能已经解决了你的问题

有时,Windows计时器不关心它们是否被空引用,并在没有父级的情况下继续触发它们的事件。我认为您的问题在于,在注销取消代码中,您正在清除对计时器的引用,但不是首先禁用它

尝试在设置myTimer=Nothing的行之前调用myTimer.Stop()


或者,为什么您需要一直创建新的计时器?你不能停止然后重新启动原来的吗?

你的自动重置属性设置为什么?我使用的是windows窗体计时器,它似乎没有自动重置属性。系统线程计时器将具有自动重置属性。就我个人而言,我不认为我会为此使用Windows计时器。在变量中保留DateTime以表示最后一次交互可能更明智。然后,您的计时器可以每隔几秒钟运行一次,只需检查datetime的值是否不超过1分钟前。我正在创建新计时器,以绝对确保我的计时器已重置。但正如你所说,计时器在没有家长的情况下继续工作,这是我不知道的。我会试着让你知道的。老实说,这不是我见过的记录,但我在过去的应用程序中有过这样的行为,计时器不再被引用,至少在GC发现它们之前,计时器会继续发出警报。#