GetlastInput and Tickcount

本文关键字:Tickcount and GetlastInput | 更新日期: 2023-09-27 18:36:50

我有一个控制台应用程序的以下代码片段,如果空闲时间超过 5 秒,我想锁定我的计算机。

问题:5 秒后没有任何反应

    public static uint GetIdleTime()
    {
        LASTINPUTINFO lastInPut = new LASTINPUTINFO();
        lastInPut.cbSize = (uint)System.Runtime.InteropServices.Marshal.SizeOf(lastInPut);
        GetLastInputInfo(ref lastInPut);
        return ((uint)Environment.TickCount - lastInPut.dwTime);
    }
    public static long GetTickCount()
    {
        return Environment.TickCount;
    }
    public static long GetLastInputTime()
    {
        LASTINPUTINFO lastInPut = new LASTINPUTINFO();
        lastInPut.cbSize = (uint)System.Runtime.InteropServices.Marshal.SizeOf(lastInPut);
        if (!GetLastInputInfo(ref lastInPut))
        {
            throw new Exception(GetLastError().ToString());
        }
        return lastInPut.dwTime;
    }

private static Timer timer;
    private static uint idle = 0;
    static void Main(string[] args)
    {
        timer = new Timer();
        timer.Enabled = true;
        timer.Interval = 1000;
        timer.Start();
        idle += GetIdleTime();            
        System.Threading.Thread.Sleep(6000);
        if (idle > 5000)
        {
            LockWorkStation();
        }
    }

GetlastInput and Tickcount

你的代码有一两件奇怪的事情。计时器没有执行太多操作,您正在累积空闲时间,并且在计算空闲时间 6 秒后测试空闲时间,而无需重新计算它。

试试这个:

    public static uint GetIdleTime()
    {
        LASTINPUTINFO lastInPut = new LASTINPUTINFO();
        lastInPut.cbSize = (uint)System.Runtime.InteropServices.Marshal.SizeOf(lastInPut);
        GetLastInputInfo(ref lastInPut);
        return ((uint)Environment.TickCount - lastInPut.dwTime);
    }
    public static long GetTickCount()
    {
        return Environment.TickCount;
    }
    [StructLayout(LayoutKind.Sequential)]
    struct LASTINPUTINFO
    {
        public static readonly int SizeOf = Marshal.SizeOf(typeof(LASTINPUTINFO));
        [MarshalAs(UnmanagedType.U4)]
        public UInt32 cbSize;
        [MarshalAs(UnmanagedType.U4)]
        public UInt32 dwTime;
    }
    [DllImport("user32.dll")]
    static extern bool GetLastInputInfo(ref LASTINPUTINFO plii);
    [DllImport("user32.dll", SetLastError = true)]
    static extern bool LockWorkStation();
    static int GetLastInputTime()
    {
        int idleTime = 0;
        LASTINPUTINFO lastInputInfo = new LASTINPUTINFO();
        lastInputInfo.cbSize = (uint)Marshal.SizeOf(lastInputInfo);
        lastInputInfo.dwTime = 0;
        int envTicks = Environment.TickCount;
        if (GetLastInputInfo(ref lastInputInfo))
        {
            int lastInputTick = (int)lastInputInfo.dwTime;
            idleTime = envTicks - lastInputTick;
        }
        return ((idleTime > 0) ? (idleTime / 1000) : 0);
    }

    private static uint idle = 0;
    static void Main(string[] args)
    {
        while (!Console.KeyAvailable)
        {
            System.Threading.Thread.Sleep(500);
            idle = GetIdleTime();
            Console.WriteLine(idle);
            if (idle > 5000)
            {
                LockWorkStation();
            }
        }
    }