自动注销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。开始()应该已经完成了这个诀窍,但那似乎并不奏效。我检查了我的预过滤消息,但仍然没有运气。
任何帮助将不胜感激。
谢谢。
好的我想我可能已经找到了你的问题。
有时,Windows计时器并不关心它们是否被空引用,并且继续在没有父代的情况下触发它们的事件。我认为你的问题在于你在logOutCancel代码中清除了定时器的引用,但不是先禁用它。
尝试在设置myTimer = Nothing的行之前调用myTimer.Stop()。
或者,您为什么需要不断创建新的定时器?你不能停下来然后重新开始你的原始?
我正在创建新的计时器,以确保我的计时器已重置。但是,正如你所说的那样,定时器在没有父母的情况下继续工作,那是我不知道的。会尝试让你知道。 – sagar 2012-08-15 14:54:13
说实话,这不是我见过的有记录的,但我曾经在过去的应用程序中发生过行为,在这些应用程序中,不再引用的定时器继续触发,直到GC赶上它们。 #] – KingCronus 2012-08-15 14:55:52
干杯,似乎已经做到了。 – sagar 2012-08-17 08:32:33
什么是您的AutoReset属性设置为? – KingCronus 2012-08-15 13:50:43
我正在使用Windows窗体计时器,它似乎没有自动重置属性。系统线程计时器将具有自动重置属性。 – sagar 2012-08-15 13:59:08
个人而言,我不认为我会为此使用Windows计时器。将DateTime保留在变量中以表示最后的交互可能更明智。然后,您的计时器每隔几秒钟就可以运行一次,以检查该日期时间的值是否不超过1分钟。 – KingCronus 2012-08-15 14:25:14