自动注销vb.net

问题描述:

我想为我的vb.net桌面应用程序实现自动注销功能。下面是代码:自动注销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 

问题是,当我在日志设置超时时间是让说1分钟,它工作正常,如果和给我的注销窗口在1分钟后,如果我不想做任何事情我应用。但是当我取消我的注销窗口消息并开始处理我的应用程序时,注销消息框不断出现。首先,我认为我的定时器没有正确重置,但是myTimer.Enabled = False应该已经完成​​了,如果没有myTimer。开始()应该已经完成​​了这个诀窍,但那似乎并不奏效。我检查了我的预过滤消息,但仍然没有运气。

任何帮助将不胜感激。

谢谢。

+0

什么是您的AutoReset属性设置为? – KingCronus 2012-08-15 13:50:43

+0

我正在使用Windows窗体计时器,它似乎没有自动重置属性。系统线程计时器将具有自动重置属性。 – sagar 2012-08-15 13:59:08

+0

个人而言,我不认为我会为此使用Windows计时器。将DateTime保留在变量中以表示最后的交互可能更明智。然后,您的计时器每隔几秒钟就可以运行一次,以检查该日期时间的值是否不超过1分钟。 – KingCronus 2012-08-15 14:25:14

好的我想我可能已经找到了你的问题。

有时,Windows计时器并不关心它们是否被空引用,并且继续在没有父代的情况下触发它们的事件。我认为你的问题在于你在logOutCancel代码中清除了定时器的引用,但不是先禁用它。

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

或者,您为什么需要不断创建新的定时器?你不能停下来然后重新开始你的原始?

+0

我正在创建新的计时器,以确保我的计时器已重置。但是,正如你所说的那样,定时器在没有父母的情况下继续工作,那是我不知道的。会尝试让你知道。 – sagar 2012-08-15 14:54:13

+0

说实话,这不是我见过的有记录的,但我曾经在过去的应用程序中发生过行为,在这些应用程序中,不再引用的定时器继续触发,直到GC赶上它们。 #] – KingCronus 2012-08-15 14:55:52

+0

干杯,似乎已经做到了。 – sagar 2012-08-17 08:32:33