Узнать, когда компьютер не используется

Есть ли способ перехватить все события клавиатуры и мыши из всех приложений, работающих в Windows с использованием.NET?

Я нашел несколько похожих постов, первый из которых - как это сделать только для разрабатываемого вами приложения: VB Detect Idle time

А также сообщение, показывающее, как долго рабочий стол простаивал: проверьте, неактивен ли пользователь

Ниже я попробовал использовать в основном таймер в основной форме, который вызывает GetInactiveTime каждые 10 секунд, и я записываю это время, а затем, когда CurrentInactiveTime

<StructLayout(LayoutKind.Sequential)> _
Public Structure LASTINPUTINFO
    Public cbSize As UInteger
    Public dwTime As UInteger
End Structure

<DllImport("user32.dll")> _
Friend Shared Function GetLastInputInfo(ByRef plii As LASTINPUTINFO) As Boolean
End Function

Public Shared Function GetInactiveTime() As TimeSpan
    Dim info As LASTINPUTINFO = New LASTINPUTINFO()
    info.cbSize = CUInt(Marshal.SizeOf(info))

    If GetLastInputInfo(info) Then
        Return TimeSpan.FromMilliseconds(Environment.TickCount - info.dwTime)
    Else
        Return Nothing
    End If
End Function

Sub Main()
    inactiveTimer = New Timer()
    inactiveTimer.Interval = 10000
    inactiveTimer.Enabled = True
    inactiveTimer.Start()

    Dim tempTime As DateTime = Now
    lastInactiveTime = tempTime - tempTime
End Sub

Private Sub inactiveTimer_Tick(sender As Object, e As EventArgs) Handles inactiveTimer.Tick
    Dim currentInactiveTime As TimeSpan = GetInActiveTime()
    Dim tempLastInactiveTime As TimeSpan = lastInactiveTime

    lastInactiveTime = currentInactiveTime

    If currentInactiveTime < tempLastInactiveTime Then
         RaiseEvent SomeEvent
    End IF
End Sub

Кроме того, я программирую в среде Windows/VB.NET.

Спасибо за помощь.

1 ответ

Решение

Я использовал это решение для той же проблемы. Это код, который я нашел в сети, но я адаптировал его под свои нужды.

Вы должны иметь возможность поместить это в окно своего кода и изменить его по мере необходимости.

Public Structure LASTINPUTINFO
    Public cbSize As Int32
    Public dwTime As Int32

End Structure

Declare Function GetLastInputInfo Lib "User32.dll" (ByRef plii As LASTINPUTINFO) As Boolean

Private Sub IdleTimer_Tick(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles IdleTimer.Tick


    If ReportingEntireClass = False Then
        Dim LII As New LASTINPUTINFO, TicksSinceLastInput As Int32 = 0

        LII.cbSize = System.Runtime.InteropServices.Marshal.SizeOf(LII)

        If GetLastInputInfo(LII) Then TicksSinceLastInput = (Environment.TickCount - LII.dwTime)

        If TicksSinceLastInput >= IdleSeconds Then
            If IdleClosing = False Then
                IdleClosing = True
                Idle.ShowDialog() 'this is a little 
                                  'form that warns about the app closing.
            End If
        End If
    End If


End Sub
Другие вопросы по тегам