Sheldon Livingston
asked on
Obtaining idle time via VB.NET.
Happy new year all...
I am trying to get the system idle time via version 4 of the .NET framework using VB.NET.
Thoughts?
I am trying to get the system idle time via version 4 of the .NET framework using VB.NET.
Public Class idleTime
Public Structure LASTINPUTINFO
Public cbSize As UInteger
Public dwTime As UInteger
End Structure
<DllImport("user32.dll")>
Private Shared Function GetLastInputInfo(ByRef plii As LASTINPUTINFO) As Boolean
End Function
Public Function GetInactiveTime() As String ' Nullable(Of TimeSpan)
Dim info As LASTINPUTINFO = New LASTINPUTINFO
info.cbSize = CUInt(Marshal.SizeOf(info))
If (GetLastInputInfo(info)) Then
Return TimeSpan.FromMilliseconds(Environment.TickCount - info.dwTime).ToString '
Else
Return "N/A" 'Nothing
End If
End Function
End Class
Through testing I see that info.dwTime always returns zero.Thoughts?
This link claims to have a working example.
https://stackoverflow.com/questions/8280799/vb-net-how-to-know-time-for-which-system-is-idle
Looks a lot like yours except this >
Private Declare Function GetTickCount Lib "kernel32" () As Long
https://stackoverflow.com/questions/8280799/vb-net-how-to-know-time-for-which-system-is-idle
Looks a lot like yours except this >
Private Declare Function GetTickCount Lib "kernel32" () As Long
ASKER
I think the issue is with LASTINPUTINFO... it always returns zero while tick count is good.
With these definition work for me:
Imports System.Runtime.InteropServ ices
<StructLayout(LayoutKind.S equential) > Structure LASTINPUTINFO
<MarshalAs(UnmanagedType.U 4)> Public cbSize As Integer
<MarshalAs(UnmanagedType.U 4)> Public dwTime As Integer
End Structure
<DllImport("user32.dll")>
Shared Function GetLastInputInfo(ByRef plii As LASTINPUTINFO) As Boolean
End Function
And I test idle time with this code:
lastInputInf.cbSize = Marshal.SizeOf(lastInputIn f)
lastInputInf.dwTime = 0
GetLastInputInfo(lastInput Inf)
Imports System.Runtime.InteropServ
<StructLayout(LayoutKind.S
<MarshalAs(UnmanagedType.U
<MarshalAs(UnmanagedType.U
End Structure
<DllImport("user32.dll")>
Shared Function GetLastInputInfo(ByRef plii As LASTINPUTINFO) As Boolean
End Function
And I test idle time with this code:
lastInputInf.cbSize = Marshal.SizeOf(lastInputIn
lastInputInf.dwTime = 0
GetLastInputInfo(lastInput
ASKER
It appears that this cannot be done from a service... only an app.
Look at the help of the function
"This function is useful for input idle detection. However, GetLastInputInfo does not provide system-wide user input information across all running sessions. Rather, GetLastInputInfo provides session-specific user input information for only the session that invoked the function."
https://docs.microsoft.com/en-us/windows/desktop/api/winuser/nf-winuser-getlastinputinfo
"This function is useful for input idle detection. However, GetLastInputInfo does not provide system-wide user input information across all running sessions. Rather, GetLastInputInfo provides session-specific user input information for only the session that invoked the function."
https://docs.microsoft.com/en-us/windows/desktop/api/winuser/nf-winuser-getlastinputinfo
ASKER CERTIFIED SOLUTION
membership
This solution is only available to members.
To access this solution, you must be a member of Experts Exchange.
ASKER
Thank you Ermanno... I will be looking into this.
If return 0 the function fails.
Try change the definitio of LASTINPUTINFO
Private Structure LASTINPUTINFO
Dim cbSize As Int32
Dim dwTime As Int32
End Structure