2012-08-15 6 views
2

내 vb.net 데스크톱 응용 프로그램에 자동 로그 오프 기능을 구현하려고합니다. 여기에 코드입니다 : 내가 1 분 말할 수있을 시간을 로그를 설정할 때자동 로그 오프 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 

문제는이,이 경우 잘 작동하고 난 아무 것도하지 않으면 일분 후에 나에게 로그 아웃 창을 제공 내 신청. 하지만 로그 아웃 창 메시지를 취소하고 응용 프로그램에서 작업을 시작하면 로그 아웃 메시지 상자가 임의로 계속 올라옵니다. 처음에는 타이머가 제대로 재설정되지 않았지만 myTimer.Enabled = False이면 myTimer를 사용하지 않아야합니다. Start()는 확실히 트릭을 완료 했어야하지만, 작동하지 않는 것 같습니다. 내 사전 필터 메시지를 확인했지만 여전히 운이 없다.

도움을 주시면 감사하겠습니다.

감사합니다.

+0

어떤 AutoReset 속성을 어떻게 설정합니까? – KingCronus

+0

Windows 폼 타이머를 사용하고 있는데 자동 재설정 속성이없는 것 같습니다. 시스템 스레드 타이머는 자동 재설정 속성을 갖습니다. – sagar

+0

개인적으로 나는 이것을 위해 Windows 타이머를 사용하지 않을 것이라고 생각합니다. 변수에 DateTime을 유지하여 마지막 상호 작용을 나타낼 수 있습니다. 그런 다음 타이머를 1 초 전에 끝내지 않고 해당 날짜의 값을 확인하기 위해 몇 초마다 타이머를 실행할 수 있습니다. – KingCronus

답변

1

확인 문제가 해결되었을 수도 있습니다.

가끔은 Windows 참조 타이머가 null 참조가 되어도 상관 없으며 부모없이 이벤트를 계속 실행합니다. 귀하의 문제는 귀하의 logOutCancel 코드에서 타이머에 대한 참조를 지우고 있지만 먼저 비활성화하지 않는 것입니다.

myTimer = Nothing을 설정 한 행 앞에 myTimer.Stop()을 호출 해보십시오.

또는 왜 새로운 타이머를 계속 만들어야합니까? 그냥 멈추고 원래의 것을 다시 시작할 수 없습니까?

+0

나는 나의 타이머가 절대적으로 재설정 될 새로운 타이머를 만들고있다. 그러나 타이머가 부모없이 일을 계속한다고 말하면서, 그것은 내가 모르는 뭔가입니다. 시도하고 알려 드리겠습니다. – sagar

+0

솔직히 말해서 내가 본 적이없는 것은 아니지만 이전에 타이머가 더 이상 참조되지 않은 응용 프로그램에서 동작을 보였습니다. GC가 GC를 따라 잡을 때까지 계속 실행되었습니다. #] – KingCronus

+0

건배, 그 일을 한 것 같습니다. – sagar