Jose M.
Jose M.

Reputation: 2340

How to determine inactivity on a winform

I have a winform that is displayed at the top of my application. What I would like to is have the form set to 20% opacity if it has been inactive for a certain amount of time. Right now I have a similar event running when I click a button, the size of the form changes. I use a timer to set the form opacity while is performing the transition. I now I can use similar code to set opacity if there is inactivity on the form, I just do not know how to dectect inactivity.

Here is what I have.

    Private Sub btnShowForm_Click(sender As Object, e As EventArgs) Handles btnShowForm.Click

    'This procedure runs when the btnShowForm
    'button is clicked. The procedure maximizes the size
    'of the form, hides the left right button and displays the button
    'to expand the form. It also moves the combobox down. 
    'It calls the viewButtons function to hide and
    'display the right buttons.     
    'The procedure also uses a timer to set the fade in and out the
    'form when is min or max

    Me.Height = 126

    Me.Opacity = 0.2                   'About 20%
    timNavigationPage.Interval = 100   'about one-tenth of a second
    timNavigationPage.Start()          'Start the timer


    cmbViewDataSheets.Location = New Point(741, 89)


    viewButtons(False, True)

End Sub

Private Sub timNavigationPage_Tick(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles timNavigationPage.Tick

    'Initialize the timer to fade form.

    Dim x As Double = 0.075

    If Me.Opacity <= 1 Then
        Me.Opacity += x     'increment opacity with 7.5%

    ElseIf Me.Opacity + x > 1 Then
        timNavigationPage.Stop()       'Stop the timer then the opacity has reached a 100%

    End If

End Sub

Upvotes: 1

Views: 1636

Answers (1)

Hans Passant
Hans Passant

Reputation: 941705

The IMessageFilter interface is good for this, it lets you see all of the mouse and keyboard messages. Enable a timer when you see one. Change the Opacity property when it ticks. Like this:

Public Class Form1
    Implements IMessageFilter

    Public Sub New()
        InitializeComponent()
        Application.AddMessageFilter(Me)
        Me.Opacity = 0.99
        Timer1.Start()
    End Sub

    Protected Overrides Sub OnFormClosed(e As FormClosedEventArgs)
        Application.RemoveMessageFilter(Me)
        MyBase.OnFormClosed(e)
    End Sub

    Private Sub Timer1_Tick(sender As Object, e As EventArgs) Handles Timer1.Tick
        Timer1.Enabled = False
        Me.Opacity = 0.3
    End Sub

    Public Function PreFilterMessage(ByRef m As Message) As Boolean Implements IMessageFilter.PreFilterMessage
        '' Bump timer on mouse or keyboard messages
        If (m.Msg >= &H200 And m.Msg <= &H20E) Or (m.Msg >= &H100 And m.Msg <= &H109) Then
            Timer1.Stop()
            Timer1.Start()
            Me.Opacity = 0.99
        End If
        Return False
    End Function
End Class

Upvotes: 2

Related Questions