2

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がない場合はトリックを実行する必要があります。 Start()は間違いなくトリックを実行するはずですが、それも機能していないようです。プレフィルターメッセージを確認しましたが、まだ運がありません。

どんな助けでも大歓迎です。

ありがとう。

4

1 に答える 1

1

OK私はあなたの問題を理解したかもしれないと思います。

場合によっては、Windowsタイマーは、null参照されているかどうかを気にせず、親なしでイベントを発生させ続けます。問題は、logOutCancelコードでタイマーへの参照をクリアしているが、最初にタイマーを無効にしていないことにあると思います。

myTimer = Nothingを設定する行の前に、myTimer.Stop()を呼び出してみてください。

あるいは、なぜ新しいタイマーを作成し続ける必要があるのですか?ただ停止してから元のを再開することはできませんか?

于 2012-08-15T13:50:17.833 に答える