2012-09-20 3 views
1

나는 현재 일정량의 비 활동 시간에 사용자를 로그 아웃 할 것입니다. 나는Application.Idle acting differentently

Private Sub ctlManagePw_Load(sender As System.Object, e As System.EventArgs) Handles MyBase.Load 
    AddHandler System.Windows.Forms.Application.Idle, AddressOf Application_Idle 
End Sub 

그리고 타이머 폼로드 이벤트에 전화, 그리고

Private Sub Application_Idle(sender As Object, e As EventArgs) 
    Timer.Interval = My.Settings.LockOutTime 
    Timer.Start() 
End Sub 

Application.Idle

선언

Private Sub Timer_Tick(sender As Object, e As EventArgs) Handles Timer.Tick 
    Try 
     If My.Settings.TrayIcon = 1 Then 
      Me.ParentForm.Controls.Remove(Me) 
      control_acPasswords() 
      _Main.NotifyIcon.Visible = True 
      _Main.NotifyIcon.ShowBalloonTip(1, "WinVault", "You've been locked out due to innactivity", ToolTipIcon.Info) 
     End If 
     'Stop 
     Timer.Stop() 
     Timer.Enabled = False 
     'Flush memory 
     FlushMemory() 
    Catch ex As Exception 
     'Error is trapped. LOL 
     Dim err = ex.Message 
    End Try 
End Sub 

유휴 이벤트가 I를 초과 할 때마다이의 문제입니다 내가 여전히 잠금 상태 였거나 응용 프로그램이 유휴 이벤트에 들어갔다는 알림이 계속 나타납니다. 내가 메모리를

Declare Function SetProcessWorkingSetSize Lib "kernel32.dll" (ByVal process As IntPtr, ByVal minimumWorkingSetSize As Integer, ByVal maximumWorkingSetSize As Integer) As Integer 
Public Sub FlushMemory() 
    Try 
     GC.Collect() 
     GC.WaitForPendingFinalizers() 
     If (Environment.OSVersion.Platform = PlatformID.Win32NT) Then 
      SetProcessWorkingSetSize(Process.GetCurrentProcess().Handle, -1, -1) 
      Dim myProcesses As Process() = Process.GetProcessesByName(Application.ProductName) 
      Dim myProcess As Process 
      For Each myProcess In myProcesses 
       SetProcessWorkingSetSize(myProcess.Handle, -1, -1) 
      Next myProcess 
     End If 
    Catch ex As Exception 
     Dim err = ex.Message 
    End Try 
End Sub 

을 확보 어디 Timer_Tick 이벤트 예외에 MsgBox(ex.Message)을 넣으면, 내가 점점 계속

control_acPasswords()

는 로그 아웃 사용자 컨트롤

입니다 그리고 여기

Object reference not set to an instance of an object

예상되는 결과는 양식이 유휴 이벤트를 입력 할 때마다 간격 또는 My.Settings.LockOutTime에서 시간은 또는 60 seconds에 대해 60000으로 저장하고 타이머를 시작합니다. 이제 Timer_Tick을 누른 다음 logout 사용자에게 간격이 끝난 경우.

이벤트 처리 방법에 문제가 있습니까?

+0

어떤 종류의 '타이머'를 사용하고 있습니까? 'Timer'라는 프레임 워크에서 제가 아는 최소한 3 가지 클래스가 있습니다 ... –

+0

도구 상자에서 타이머 컨트롤. 방금 타이머라고 명명했습니다. –

+0

@Damien_The_Unbeliever –

답변

3

Application.Idle 이벤트가 여러 번 발생합니다. Winforms가 메시지 큐에서 모든 메시지를 검색하여 비울 때마다. 문제는 두 번째 및 후속 시간에 이미 시작된 타이머를 시작한다는 것입니다. 그건 아무 효과가 없으므로 재설정해야 프로그래밍 된 간격 동안 다시 똑딱 거리게됩니다. 쉬운 일 :

Private Sub Application_Idle(sender As Object, e As EventArgs) 
    Timer.Interval = My.Settings.LockOutTime 
    Timer.Stop() 
    Timer.Start() 
End Sub 

다음 문제는 아마도 예외의 이유는 양식을 닫을 때 명시 적으로 이벤트를 구독 취소해야한다는 것입니다. 자동이 아닙니다. Application.Idle은 정적 이벤트입니다. 한스 '대답 또한

Protected Overrides Sub OnFormClosed(ByVal e As System.Windows.Forms.FormClosedEventArgs) 
    Timer.Stop() 
    RemoveHandler Application.Idle, AddressOf Application_Idle 
    MyBase.OnFormClosed(e) 
End Sub 
+0

한스, 고맙습니다. Btw, 예외 문제는 양식에 실제로 없을 때 활성 양식에서 제거되는 UserControl 때문이었습니다.:) –

2

: 다음 FormClosed 이벤트를 사용하여 사용자가 더 이상 유휴 상태 일 때 당신은 타이머 실행을 중지 한 것처럼 보일하지 않습니다. 즉, 유휴 상태 일 때 타이머가 시작되지만, 다시 돌아 오면 타이머가 틱 할 때 잠겨 있습니다.

사용자가 다시 활성화 될 때 타이머를 중지해야합니다.

+0

나는 그것을 MouseMove 및 KeyPress 이벤트에서 시도했다. 그러나 그것은 나를 위해 일하지 않는 것 같습니다. –