Introduction
System idle time is the time that has passed since the computer has received its last input from the user. It can be used to detect whether the user is idle or not. This feature is present in many instant messaging systems.
Visual Studio 2003 does not provide an explicit way to accomplish this, but I found an alternate method using C# code only.
Using the code
The implemented solution calls functions inside the user32.dll and kernel32.dll files.
To do this, it is necessary:
- To add a reference to the
System.Runtime.InteropServices
namespace.
- To know the name and definition of the function to be called.
- To create an
extern
function using C#.
- To make any additional structure to be used in the called functions.
using System.Runtime.InteropServices;
[DllImport("User32.dll")]
private static extern bool
GetLastInputInfo(ref LASTINPUTINFO plii);
internal struct LASTINPUTINFO
{
public uint cbSize;
public uint dwTime;
}
When I was trying to make things works, I found an issue with the LASTINPUTINFO
structure. I solved the problem by creating a C# struct with the same members as the original function. Note that you need to know the mapping between a Windows data type and the .NET Framework data types. The following table is very useful:
BOOL |
Boolean variable (should be TRUE or FALSE ). |
BOOLEAN |
Boolean variable (should be TRUE or FALSE ). |
BYTE |
Byte (8 bits). |
CALLBACK |
Calling convention for callback functions. |
CHAR |
8-bit Windows (ANSI) character. |
COLORREF |
Red, green, blue (RGB) color value (32 bits). |
CONST |
Variable whose value is to remain constant during execution. |
DWORD |
32-bit unsigned integer. |
DWORD_PTR |
Unsigned long type for pointer precision. Use when casting a pointer to a long type to perform pointer arithmetic. (Also commonly used for general 32-bit parameters that have been extended to 64 bits in 64-bit Windows.) |
INT |
32-bit signed integer. |
INT_PTR |
Signed integral type for pointer precision. Use when casting a pointer to an integer to perform pointer arithmetic. |
INT32 |
32-bit signed integer. |
INT64 |
64-bit signed integer. |
LONG |
32-bit signed integer. |
LONG_PTR |
Signed long type for pointer precision. Use when casting a pointer to a long to perform pointer arithmetic. |
LONG32 |
32-bit signed integer. |
LONG64 |
64-bit signed integer. |
LONGLONG |
64-bit signed integer. |
LPARAM |
Message parameter. |
LPBOOL |
Pointer to a BOOL . |
LPBYTE |
Pointer to a BYTE . |
When using a struct as a parameter, you have to initialize it before it is passed to the function:
LASTINPUTINFO lastInPut = new LASTINPUTINFO();
lastInPut.cbSize = (uint)
System.Runtime.InteropServices.Marshal.SizeOf(lastInPut);
The rest of the code does not contain any trick.
Using the code
The best method to use the code is compiling it in an DLL and using the functions asynchronously using a timer or threads.