using System.Runtime.InteropServices; using System.Text; namespace WindowWatcher; internal static partial class NativeMethods { [LibraryImport("user32.dll")] internal static partial IntPtr GetForegroundWindow(); [DllImport("user32.dll", CharSet = CharSet.Unicode)] internal static extern int GetWindowText(IntPtr hWnd, StringBuilder text, int count); [LibraryImport("user32.dll", SetLastError = true)] internal static partial uint GetWindowThreadProcessId(IntPtr hWnd, out uint processId); [StructLayout(LayoutKind.Sequential)] internal struct LASTINPUTINFO { public uint cbSize; public uint dwTime; } [DllImport("user32.dll")] internal static extern bool GetLastInputInfo(ref LASTINPUTINFO plii); internal static TimeSpan GetIdleTime() { var info = new LASTINPUTINFO { cbSize = (uint)Marshal.SizeOf() }; if (!GetLastInputInfo(ref info)) return TimeSpan.Zero; return TimeSpan.FromMilliseconds(Environment.TickCount64 - info.dwTime); } }