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

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

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

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

То, что я пробовал, приведено ниже, в основном с использованием таймера в моей основной форме, который вызывает GetInactiveTime каждые 10 секунд, и я записываю это время, а затем, когда CurrentInactiveTime ‹LastInactiveTime, я инициирую событие. Я ищу что-то более точное и более точное.

<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.

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


person Dan King    schedule 22.11.2012    source источник


Ответы (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
person Wayne Workman    schedule 22.11.2012