Узнать, когда компьютер не используется
Есть ли способ перехватить все события клавиатуры и мыши из всех приложений, работающих в Windows с использованием.NET?
Я нашел несколько похожих постов, первый из которых - как это сделать только для разрабатываемого вами приложения: VB Detect Idle time
А также сообщение, показывающее, как долго рабочий стол простаивал: проверьте, неактивен ли пользователь
Ниже я попробовал использовать в основном таймер в основной форме, который вызывает GetInactiveTime каждые 10 секунд, и я записываю это время, а затем, когда CurrentInactiveTime Кроме того, я программирую в среде Windows/VB.NET. Спасибо за помощь.<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
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