2017-06-19 5 views
1

フォームにアクションがない場合、vb.netでイベント/実行機能を起動するにはどうすればよいですか?フォームに何らかのアクションが何もない場合に実行する

私はこれを試してみました:

Private Sub Window_MouseMove(sender As Object, e As MouseEventArgs) 

    mint_LastInitializedTimerID = mint_LastInitializedTimerID + 0.00000001 


    Dim intMilliseconds As Integer = 5000 


    Dim objTimer As New System.Timers.Timer(intMilliseconds) 
    AddHandler objTimer.Elapsed, AddressOf Window_TimerElapsed 

    objTimer.AutoReset = False 
    objTimer.Enabled = True 

End Sub 
Private Sub Window_TimerElapsed(ByVal sender As Object, ByVal e As System.Timers.ElapsedEventArgs) 

    mint_LastReceivedTimerID = mint_LastReceivedTimerID + 0.00000001 


    If mint_LastReceivedTimerID = mint_LastInitializedTimerID Then 
     Me.Dispatcher.Invoke(Sub() showLogin(), System.Windows.Threading.DispatcherPriority.Normal) 
    End If 

End Sub 

Public Function showLogin() 
    WinUIMessageBox.Show(Window.GetWindow(Me), "!", "...", CType("1", MessageBoxButton), MessageBoxResult.None, MessageBoxOptions.None) 

End Function 

しかし、いくつかの理由で、初めてそれが倍の機能の多くをアップ発射OKと次の時間を動作します。

答えて

1

あなたはユーザーの種類や、アプリケーションでマウスどこでもを使用する場合に決定するためにIMessageFilterApplication.AddMessageFilterを使用することができます。カスタムフィルタークラスで、カスタムイベントをメインフォーム(または他のもの)がトラップするようにします。簡単な例...

Public Class Form1 

    Private WithEvents mmf As MyMessageFilter 

    Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load 
     mmf = New MyMessageFilter(TimeSpan.FromSeconds(5)) 
     Application.AddMessageFilter(mmf) 
    End Sub 

    Private Sub mmf_UserIdle() Handles mmf.UserIdle 
     Me.Text = "User Idle @ " & DateTime.Now 
    End Sub 

    Private Class MyMessageFilter 
     Implements IMessageFilter 

     Private Enum UserActivity 
      WM_KEYDOWN = &H100 
      WM_KEYUP = &H101 
      WM_SYSKEYDOWN = &H104 
      WM_SYSKEYUP = &H105 
      WM_MOUSEMOVE = &H200 
      WM_LBUTTONDOWN = &H201 
      WM_LBUTTONUP = &H202 
      WM_RBUTTONDOWN = &H204 
      WM_RBUTTONUP = &H205 
     End Enum 

     Public Event UserIdle() 

     Private WithEvents tmr As New System.Timers.Timer() 
     Private SC As System.Threading.SynchronizationContext 

     Private Sub New() 
     End Sub 

     Public Sub New(ByVal TimeOutDuration As TimeSpan) 
      SC = System.Windows.Forms.WindowsFormsSynchronizationContext.Current 
      tmr.Interval = TimeOutDuration.TotalMilliseconds 
      tmr.Start() 
     End Sub 

     Private Sub Reset() 
      tmr.Stop() 
      tmr.Start() 
     End Sub 

     Private Sub tmr_Elapsed(ByVal sender As Object, ByVal e As System.Timers.ElapsedEventArgs) Handles tmr.Elapsed 
      ' raise the event in a thread safe manner 
      If Not IsNothing(SC) Then 
       SC.Post(New System.Threading.SendOrPostCallback(AddressOf GuiSafeRaiseEvent), Nothing) 
      End If 
     End Sub 

     Private Sub GuiSafeRaiseEvent() ' do not call me directly! 
      RaiseEvent UserIdle() 
     End Sub 

     Private Function PreFilterMessage(ByRef m As System.Windows.Forms.Message) As Boolean Implements System.Windows.Forms.IMessageFilter.PreFilterMessage 
      Select Case m.Msg 
       Case UserActivity.WM_KEYDOWN, UserActivity.WM_KEYUP, UserActivity.WM_LBUTTONDOWN, UserActivity.WM_LBUTTONUP, UserActivity.WM_MOUSEMOVE, UserActivity.WM_RBUTTONDOWN, UserActivity.WM_RBUTTONUP, UserActivity.WM_SYSKEYDOWN, UserActivity.WM_SYSKEYUP 
        Me.Reset() ' the user did something, reset the timer 

      End Select 

      Return False ' allow normal processing to occur for all messages 
     End Function 

    End Class 

End Class 
0

私は、マウスが動いている毎ミリ秒ごとに新しいハンドラを作成していると思います。フォームがロードされたときにタイマーを作成し、マウスが動くたびに0にリセットしたいと思うでしょう。

0

もう1つのオプションは、この記事https://stackoverflow.com/a/44552767/5162073と似ています。あなたはアイドル時間の任意の量の後に必要に応じて応答することができます。

If a.GetIdleTime() > 300 Then 
    showLogin() 
    End If 
関連する問題